mirror of
https://github.com/octoleo/plantuml.git
synced 2024-12-22 10:59:01 +00:00
Version 6939
This commit is contained in:
parent
fe6831d641
commit
df0e7faa11
@ -28,16 +28,18 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 6302 $
|
||||
* Revision $Revision: 6922 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
@ -84,13 +86,14 @@ public abstract class AbstractPSystem implements PSystem {
|
||||
return 1;
|
||||
}
|
||||
|
||||
public List<File> exportDiagrams(File suggestedFile, FileFormatOption fileFormat) throws IOException, InterruptedException {
|
||||
public List<File> exportDiagrams(File suggestedFile, FileFormatOption fileFormat) throws IOException,
|
||||
InterruptedException {
|
||||
if (suggestedFile.exists() && suggestedFile.isDirectory()) {
|
||||
throw new IllegalArgumentException("File is a directory " + suggestedFile);
|
||||
}
|
||||
OutputStream os = null;
|
||||
try {
|
||||
os = new FileOutputStream(suggestedFile);
|
||||
os = new BufferedOutputStream(new FileOutputStream(suggestedFile));
|
||||
this.exportDiagram(os, null, 0, fileFormat);
|
||||
} finally {
|
||||
if (os != null) {
|
||||
@ -100,6 +103,11 @@ public abstract class AbstractPSystem implements PSystem {
|
||||
return Arrays.asList(suggestedFile);
|
||||
}
|
||||
|
||||
|
||||
public List<? extends CharSequence> getTitle() {
|
||||
if (source == null) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
return source.getTitle();
|
||||
}
|
||||
|
||||
}
|
||||
|
53
src/net/sourceforge/plantuml/AlignParam.java
Normal file
53
src/net/sourceforge/plantuml/AlignParam.java
Normal file
@ -0,0 +1,53 @@
|
||||
/* ========================================================================
|
||||
* 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: 6549 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
|
||||
import net.sourceforge.plantuml.graphic.HorizontalAlignement;
|
||||
|
||||
|
||||
public enum AlignParam {
|
||||
|
||||
SEQUENCE_MESSAGE_ALIGN(HorizontalAlignement.LEFT),
|
||||
SEQUENCE_REFERENCE_ALIGN(HorizontalAlignement.CENTER);
|
||||
|
||||
private final HorizontalAlignement defaultValue;
|
||||
|
||||
private AlignParam(HorizontalAlignement defaultValue) {
|
||||
this.defaultValue = defaultValue;
|
||||
}
|
||||
|
||||
public final HorizontalAlignement getDefaultValue() {
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
@ -52,10 +52,10 @@ final public class BlockUmlBuilder {
|
||||
private final List<BlockUml> blocks = new ArrayList<BlockUml>();
|
||||
private final Set<File> usedFiles = new HashSet<File>();
|
||||
|
||||
public BlockUmlBuilder(List<String> config, Defines defines, Reader reader) throws IOException {
|
||||
public BlockUmlBuilder(List<String> config, Defines defines, Reader reader, File newCurrentDir) throws IOException {
|
||||
Preprocessor includer = null;
|
||||
try {
|
||||
includer = new Preprocessor(new UncommentReadLine(new ReadLineReader(reader)), defines, usedFiles);
|
||||
includer = new Preprocessor(new UncommentReadLine(new ReadLineReader(reader)), defines, usedFiles, newCurrentDir);
|
||||
init(includer, config);
|
||||
} finally {
|
||||
if (includer != null) {
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 6475 $
|
||||
* Revision $Revision: 6549 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
@ -84,6 +84,8 @@ public enum ColorParam {
|
||||
sequenceActorBorder,
|
||||
sequenceGroupBorder,
|
||||
sequenceGroupBackground(true),
|
||||
sequenceReferenceBorder,
|
||||
sequenceReferenceHeaderBackground(true),
|
||||
sequenceReferenceBackground(true),
|
||||
sequenceDividerBackground(true),
|
||||
sequenceLifeLineBackground(true),
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 4959 $
|
||||
* Revision $Revision: 6843 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
@ -73,4 +73,31 @@ public class Dimension2DDouble extends Dimension2D {
|
||||
return new Dimension2DDouble(dim.getWidth() + deltaWidth, dim.getHeight() + deltaHeight);
|
||||
}
|
||||
|
||||
public static Dimension2D mergeTB(Dimension2D top, Dimension2D bottom) {
|
||||
final double width = Math.max(top.getWidth(), bottom.getWidth());
|
||||
final double height = top.getHeight() + bottom.getHeight();
|
||||
return new Dimension2DDouble(width, height);
|
||||
}
|
||||
|
||||
public static Dimension2D mergeTB(Dimension2D top1, Dimension2D top2, Dimension2D bottom) {
|
||||
final double width = MathUtils.max(top1.getWidth(), top2.getWidth(), bottom.getWidth());
|
||||
final double height = top1.getHeight() + top2.getHeight() + bottom.getHeight();
|
||||
return new Dimension2DDouble(width, height);
|
||||
}
|
||||
|
||||
public static Dimension2D atLeast(Dimension2D dim, double minWidth, double minHeight) {
|
||||
double h = dim.getHeight();
|
||||
double w = dim.getWidth();
|
||||
if (w > minWidth && h > minHeight) {
|
||||
return dim;
|
||||
}
|
||||
if (h < minHeight) {
|
||||
h = minHeight;
|
||||
}
|
||||
if (w < minWidth) {
|
||||
w = minWidth;
|
||||
}
|
||||
return new Dimension2DDouble(w, h);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 6070 $
|
||||
* Revision $Revision: 6616 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
@ -60,14 +60,12 @@ public class DirWatcher {
|
||||
}
|
||||
|
||||
public List<GeneratedImage> buildCreatedFiles() throws IOException, InterruptedException {
|
||||
boolean error = false;
|
||||
final List<GeneratedImage> result = new ArrayList<GeneratedImage>();
|
||||
process(dir, result);
|
||||
Collections.sort(result);
|
||||
return Collections.unmodifiableList(result);
|
||||
for (File f : dir.listFiles()) {
|
||||
if (error) {
|
||||
continue;
|
||||
}
|
||||
|
||||
private void process(File dirToProcess, final List<GeneratedImage> result) throws IOException, InterruptedException {
|
||||
for (File f : dirToProcess.listFiles()) {
|
||||
if (f.isFile() == false) {
|
||||
continue;
|
||||
}
|
||||
@ -83,10 +81,36 @@ public class DirWatcher {
|
||||
files.add(f);
|
||||
for (GeneratedImage g : sourceFileReader.getGeneratedImages()) {
|
||||
result.add(g);
|
||||
if (OptionFlags.getInstance().isFailOnError() && g.isError()) {
|
||||
error = true;
|
||||
}
|
||||
}
|
||||
modifieds.put(f, new FileWatcher(files));
|
||||
}
|
||||
}
|
||||
Collections.sort(result);
|
||||
return Collections.unmodifiableList(result);
|
||||
}
|
||||
|
||||
public File getErrorFile() throws IOException, InterruptedException {
|
||||
for (File f : dir.listFiles()) {
|
||||
if (f.isFile() == false) {
|
||||
continue;
|
||||
}
|
||||
if (fileToProcess(f.getName()) == false) {
|
||||
continue;
|
||||
}
|
||||
final FileWatcher watcher = modifieds.get(f);
|
||||
|
||||
if (watcher == null || watcher.hasChanged()) {
|
||||
final SourceFileReader sourceFileReader = new SourceFileReader(new Defines(), f, option.getOutputDir(),
|
||||
option.getConfig(), option.getCharset(), option.getFileFormatOption());
|
||||
if (sourceFileReader.hasError()) {
|
||||
return f;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private boolean fileToProcess(String name) {
|
||||
|
122
src/net/sourceforge/plantuml/DirWatcher2.java
Normal file
122
src/net/sourceforge/plantuml/DirWatcher2.java
Normal file
@ -0,0 +1,122 @@
|
||||
/* ========================================================================
|
||||
* 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: 6070 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.TreeMap;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.Future;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import net.sourceforge.plantuml.preproc.Defines;
|
||||
|
||||
public class DirWatcher2 {
|
||||
|
||||
final private File dir;
|
||||
final private Option option;
|
||||
final private String pattern;
|
||||
|
||||
final private Map<File, FileWatcher> modifieds = new ConcurrentHashMap<File, FileWatcher>();
|
||||
final private ExecutorService executorService;
|
||||
|
||||
public DirWatcher2(File dir, Option option, String pattern) {
|
||||
this.dir = dir;
|
||||
this.option = option;
|
||||
this.pattern = pattern;
|
||||
final int nb = Option.defaultNbThreads();
|
||||
this.executorService = Executors.newFixedThreadPool(nb);
|
||||
}
|
||||
|
||||
public Map<File, Future<List<GeneratedImage>>> buildCreatedFiles() throws IOException, InterruptedException {
|
||||
final Map<File, Future<List<GeneratedImage>>> result = new TreeMap<File, Future<List<GeneratedImage>>>();
|
||||
for (final File f : dir.listFiles()) {
|
||||
if (f.isFile() == false) {
|
||||
continue;
|
||||
}
|
||||
if (fileToProcess(f.getName()) == false) {
|
||||
continue;
|
||||
}
|
||||
final FileWatcher watcher = modifieds.get(f);
|
||||
|
||||
if (watcher == null || watcher.hasChanged()) {
|
||||
final SourceFileReader sourceFileReader = new SourceFileReader(new Defines(), f, option.getOutputDir(),
|
||||
option.getConfig(), option.getCharset(), option.getFileFormatOption());
|
||||
modifieds.put(f, new FileWatcher(Collections.singleton(f)));
|
||||
final Future<List<GeneratedImage>> value = executorService.submit(new Callable<List<GeneratedImage>>() {
|
||||
public List<GeneratedImage> call() throws Exception {
|
||||
try {
|
||||
final List<GeneratedImage> generatedImages = sourceFileReader.getGeneratedImages();
|
||||
final Set<File> files = new HashSet<File>(sourceFileReader.getIncludedFiles());
|
||||
files.add(f);
|
||||
modifieds.put(f, new FileWatcher(files));
|
||||
return Collections.unmodifiableList(generatedImages);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return Collections.emptyList();
|
||||
}
|
||||
}
|
||||
});
|
||||
result.put(f, value);
|
||||
}
|
||||
}
|
||||
return Collections.unmodifiableMap(result);
|
||||
}
|
||||
|
||||
private boolean fileToProcess(String name) {
|
||||
return name.matches(pattern);
|
||||
}
|
||||
|
||||
public final File getDir() {
|
||||
return dir;
|
||||
}
|
||||
|
||||
public void cancel() {
|
||||
executorService.shutdownNow();
|
||||
}
|
||||
|
||||
public void waitEnd() throws InterruptedException {
|
||||
executorService.shutdown();
|
||||
executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
|
||||
}
|
||||
|
||||
}
|
@ -51,4 +51,17 @@ public enum Direction {
|
||||
}
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
|
||||
public static Direction fromChar(char c) {
|
||||
if (c == '<') {
|
||||
return Direction.LEFT;
|
||||
}
|
||||
if (c == '>') {
|
||||
return Direction.RIGHT;
|
||||
}
|
||||
if (c == '^') {
|
||||
return Direction.UP;
|
||||
}
|
||||
return Direction.DOWN;
|
||||
}
|
||||
}
|
||||
|
@ -28,22 +28,39 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 6130 $
|
||||
* Revision $Revision: 6671 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
|
||||
public enum FileFormat {
|
||||
PNG, SVG, EPS, EPS_VIA_SVG, ATXT, UTXT, DOT, XMI_STANDARD, XMI_STAR, XMI_ARGO;
|
||||
PNG, SVG, EPS, EPS_TEXT, ATXT, UTXT, DOT, XMI_STANDARD, XMI_STAR, XMI_ARGO, PDF;
|
||||
|
||||
public String getFileSuffix() {
|
||||
if (this == EPS_VIA_SVG) {
|
||||
throw new UnsupportedOperationException("Not used anymore");
|
||||
// return EPS.getFileSuffix();
|
||||
}
|
||||
if (name().startsWith("XMI")) {
|
||||
return ".XMI";
|
||||
}
|
||||
if (this == EPS_TEXT) {
|
||||
return EPS.getFileSuffix();
|
||||
}
|
||||
return "." + name().toLowerCase();
|
||||
}
|
||||
|
||||
public boolean isEps() {
|
||||
if (this == EPS) {
|
||||
return true;
|
||||
}
|
||||
if (this == EPS_TEXT) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public String changeName(String fileName, int cpt) {
|
||||
if (cpt == 0) {
|
||||
return fileName.replaceAll("\\.\\w+$", getFileSuffix());
|
||||
}
|
||||
return fileName.replaceAll("\\.\\w+$", "_" + String.format("%03d", cpt) + getFileSuffix());
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 4929 $
|
||||
* Revision $Revision: 6908 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
@ -40,7 +40,7 @@ public class FileSystem {
|
||||
|
||||
private final static FileSystem singleton = new FileSystem();
|
||||
|
||||
private File currentDir;
|
||||
private final ThreadLocal<File> currentDir = new ThreadLocal<File>();
|
||||
|
||||
private FileSystem() {
|
||||
reset();
|
||||
@ -55,15 +55,19 @@ public class FileSystem {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
Log.info("Setting current dir: " + dir);
|
||||
this.currentDir = dir;
|
||||
this.currentDir.set(dir);
|
||||
}
|
||||
|
||||
public File getCurrentDir() {
|
||||
return this.currentDir;
|
||||
return this.currentDir.get();
|
||||
}
|
||||
|
||||
public File getFile(String nameOrPath) throws IOException {
|
||||
return new File(currentDir.getAbsoluteFile(), nameOrPath).getCanonicalFile();
|
||||
final File dir = currentDir.get();
|
||||
if (dir == null) {
|
||||
return new File(nameOrPath).getCanonicalFile();
|
||||
}
|
||||
return new File(dir.getAbsoluteFile(), nameOrPath).getCanonicalFile();
|
||||
}
|
||||
|
||||
public void reset() {
|
||||
|
@ -41,29 +41,14 @@ import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
|
||||
import net.sourceforge.plantuml.cucadiagram.dot.DrawFile;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
public class FileUtils {
|
||||
|
||||
private static final Collection<DrawFile> toDelete = new ArrayList<DrawFile>();
|
||||
private static AtomicInteger counter;
|
||||
|
||||
public static void deleteOnExit(DrawFile file) {
|
||||
if (toDelete.isEmpty()) {
|
||||
Runtime.getRuntime().addShutdownHook(new Thread() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (OptionFlags.getInstance().isKeepTmpFiles() == false) {
|
||||
for (DrawFile f : toDelete) {
|
||||
f.delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
toDelete.add(file);
|
||||
public static void resetCounter() {
|
||||
counter = new AtomicInteger(0);
|
||||
}
|
||||
|
||||
public static File getTmpDir() {
|
||||
@ -90,7 +75,16 @@ public class FileUtils {
|
||||
if (suffix.startsWith(".") == false) {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
final File f = File.createTempFile(prefix, suffix);
|
||||
if (prefix == null) {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
final File f;
|
||||
if (counter == null) {
|
||||
f = File.createTempFile(prefix, suffix);
|
||||
} else {
|
||||
final String name = prefix + counter.addAndGet(1) + suffix;
|
||||
f = new File(name);
|
||||
}
|
||||
Log.info("Creating temporary file: " + f);
|
||||
if (OptionFlags.getInstance().isKeepTmpFiles() == false) {
|
||||
f.deleteOnExit();
|
||||
@ -112,4 +106,26 @@ public class FileUtils {
|
||||
fis.close();
|
||||
}
|
||||
|
||||
static public void copyToStream(File src, OutputStream os) throws IOException {
|
||||
final InputStream fis = new BufferedInputStream(new FileInputStream(src));
|
||||
final OutputStream fos = new BufferedOutputStream(os);
|
||||
int lu;
|
||||
while ((lu = fis.read()) != -1) {
|
||||
fos.write(lu);
|
||||
}
|
||||
fos.close();
|
||||
fis.close();
|
||||
}
|
||||
|
||||
static public void copyToStream(InputStream is, OutputStream os) throws IOException {
|
||||
final InputStream fis = new BufferedInputStream(is);
|
||||
final OutputStream fos = new BufferedOutputStream(os);
|
||||
int lu;
|
||||
while ((lu = fis.read()) != -1) {
|
||||
fos.write(lu);
|
||||
}
|
||||
fos.close();
|
||||
fis.close();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -43,11 +43,19 @@ public class FileWatcher {
|
||||
private final Map<File, Long> modified2 = new HashMap<File, Long>();
|
||||
|
||||
public FileWatcher(Set<File> files) {
|
||||
if (files.size() == 0) {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
for (File f : files) {
|
||||
modified2.put(f, f.lastModified());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return modified2.toString();
|
||||
}
|
||||
|
||||
public boolean hasChanged() {
|
||||
for (Map.Entry<File, Long> ent : modified2.entrySet()) {
|
||||
final long nowModified = ent.getKey().lastModified();
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 6475 $
|
||||
* Revision $Revision: 6866 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
@ -87,11 +87,17 @@ public enum FontParam {
|
||||
this.defaultFamily = defaultFamily;
|
||||
}
|
||||
|
||||
public final int getDefaultSize() {
|
||||
public final int getDefaultSize(ISkinParam skinParam) {
|
||||
if (OptionFlags.SVEK && this==CLASS_ATTRIBUTE) {
|
||||
return 11;
|
||||
}
|
||||
return defaultSize;
|
||||
}
|
||||
|
||||
public final int getDefaultFontStyle() {
|
||||
public final int getDefaultFontStyle(ISkinParam skinParam) {
|
||||
if (OptionFlags.SVEK && this==PACKAGE) {
|
||||
return Font.BOLD;
|
||||
}
|
||||
return fontStyle;
|
||||
}
|
||||
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 3824 $
|
||||
* Revision $Revision: 6615 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
@ -39,11 +39,10 @@ public class GeneratedImage implements Comparable<GeneratedImage> {
|
||||
|
||||
private final File pngFile;
|
||||
private final String description;
|
||||
private final PSystem system;
|
||||
|
||||
public GeneratedImage(File pngFile, String description) {
|
||||
if (pngFile == null) {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
public GeneratedImage(File pngFile, String description, PSystem system) {
|
||||
this.system = system;
|
||||
this.pngFile = pngFile;
|
||||
this.description = description;
|
||||
}
|
||||
@ -56,6 +55,10 @@ public class GeneratedImage implements Comparable<GeneratedImage> {
|
||||
return description;
|
||||
}
|
||||
|
||||
public boolean isError() {
|
||||
return system instanceof PSystemError;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return pngFile.getAbsolutePath() + " " + description;
|
||||
|
@ -33,11 +33,12 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
|
||||
import java.awt.Font;
|
||||
|
||||
import net.sourceforge.plantuml.cucadiagram.dot.DotSplines;
|
||||
import net.sourceforge.plantuml.cucadiagram.dot.GraphvizLayoutStrategy;
|
||||
import net.sourceforge.plantuml.graphic.HorizontalAlignement;
|
||||
import net.sourceforge.plantuml.graphic.HtmlColor;
|
||||
import net.sourceforge.plantuml.ugraphic.ColorMapper;
|
||||
import net.sourceforge.plantuml.ugraphic.UFont;
|
||||
|
||||
public interface ISkinParam {
|
||||
|
||||
@ -47,15 +48,11 @@ public interface ISkinParam {
|
||||
|
||||
public HtmlColor getHtmlColor(ColorParam param, String stereotype);
|
||||
|
||||
public int getFontSize(FontParam param, String stereotype);
|
||||
|
||||
public String getFontFamily(FontParam param, String stereotype);
|
||||
|
||||
public HtmlColor getFontHtmlColor(FontParam param, String stereotype);
|
||||
|
||||
public int getFontStyle(FontParam param, String stereotype);
|
||||
public UFont getFont(FontParam fontParam, String stereotype);
|
||||
|
||||
public Font getFont(FontParam fontParam, String stereotype);
|
||||
public HorizontalAlignement getHorizontalAlignement(AlignParam param);
|
||||
|
||||
public int getCircledCharacterRadius();
|
||||
|
||||
@ -63,7 +60,7 @@ public interface ISkinParam {
|
||||
|
||||
public int classAttributeIconSize();
|
||||
|
||||
public boolean isMonochrome();
|
||||
public ColorMapper getColorMapper();
|
||||
|
||||
public int getDpi();
|
||||
|
||||
|
49
src/net/sourceforge/plantuml/ISourceFileReader.java
Normal file
49
src/net/sourceforge/plantuml/ISourceFileReader.java
Normal file
@ -0,0 +1,49 @@
|
||||
/* ========================================================================
|
||||
* 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: 4771 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
|
||||
public interface ISourceFileReader {
|
||||
|
||||
public List<GeneratedImage> getGeneratedImages() throws IOException, InterruptedException;
|
||||
|
||||
public List<String> getEncodedUrl() throws IOException, InterruptedException;
|
||||
|
||||
public boolean hasError() throws IOException, InterruptedException;
|
||||
|
||||
|
||||
|
||||
}
|
@ -104,6 +104,7 @@ public class LanguageDescriptor {
|
||||
keyword.add("header");
|
||||
keyword.add("center");
|
||||
keyword.add("rotate");
|
||||
keyword.add("ref");
|
||||
|
||||
|
||||
preproc.add("!include");
|
||||
|
@ -28,25 +28,25 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 3824 $
|
||||
* Revision $Revision: 6528 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
|
||||
public abstract class Log {
|
||||
|
||||
private static long start = System.currentTimeMillis();
|
||||
private static final long start = System.currentTimeMillis();
|
||||
|
||||
public static void debug(String s) {
|
||||
public synchronized static void debug(String s) {
|
||||
}
|
||||
|
||||
public static void info(String s) {
|
||||
public synchronized static void info(String s) {
|
||||
if (OptionFlags.getInstance().isVerbose()) {
|
||||
System.out.println(format(s));
|
||||
}
|
||||
}
|
||||
|
||||
public static void error(String s) {
|
||||
public synchronized static void error(String s) {
|
||||
System.err.println(s);
|
||||
}
|
||||
|
||||
|
46
src/net/sourceforge/plantuml/MathUtils.java
Normal file
46
src/net/sourceforge/plantuml/MathUtils.java
Normal file
@ -0,0 +1,46 @@
|
||||
/* ========================================================================
|
||||
* 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: 6719 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
|
||||
public class MathUtils {
|
||||
|
||||
public static double max(double a, double b) {
|
||||
return Math.max(a, b);
|
||||
}
|
||||
|
||||
public static double max(double a, double b, double c) {
|
||||
return Math.max(Math.max(a, b), c);
|
||||
}
|
||||
|
||||
}
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 6448 $
|
||||
* Revision $Revision: 6702 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
@ -57,9 +57,15 @@ public class Option {
|
||||
private boolean decodeurl = false;
|
||||
private boolean pipe = false;
|
||||
private boolean syntax = false;
|
||||
private boolean checkOnly = false;
|
||||
private boolean pattern = false;
|
||||
private boolean duration = false;
|
||||
private int nbThreads = 0;
|
||||
private int ftpPort = -1;
|
||||
|
||||
private File outputDir = null;
|
||||
private File outputFile = null;
|
||||
|
||||
private final List<String> result = new ArrayList<String>();
|
||||
|
||||
public Option() {
|
||||
@ -91,6 +97,8 @@ public class Option {
|
||||
setFileFormat(FileFormat.XMI_STAR);
|
||||
} else if (s.equalsIgnoreCase("-teps") || s.equalsIgnoreCase("-eps")) {
|
||||
setFileFormat(FileFormat.EPS);
|
||||
} else if (s.equalsIgnoreCase("-teps:text") || s.equalsIgnoreCase("-eps:text")) {
|
||||
setFileFormat(FileFormat.EPS_TEXT);
|
||||
} else if (s.equalsIgnoreCase("-tdot") || s.equalsIgnoreCase("-dot")) {
|
||||
setFileFormat(FileFormat.DOT);
|
||||
OptionFlags.getInstance().setKeepTmpFiles(true);
|
||||
@ -98,12 +106,20 @@ public class Option {
|
||||
setFileFormat(FileFormat.ATXT);
|
||||
} else if (s.equalsIgnoreCase("-tutxt") || s.equalsIgnoreCase("-utxt")) {
|
||||
setFileFormat(FileFormat.UTXT);
|
||||
} else if (s.equalsIgnoreCase("-pdf") || s.equalsIgnoreCase("-tpdf")) {
|
||||
setFileFormat(FileFormat.PDF);
|
||||
} else if (s.equalsIgnoreCase("-output") || s.equalsIgnoreCase("-o")) {
|
||||
i++;
|
||||
if (i == arg.length) {
|
||||
continue;
|
||||
}
|
||||
outputDir = new File(StringUtils.eventuallyRemoveStartingAndEndingDoubleQuote(arg[i]));
|
||||
} else if (s.equalsIgnoreCase("-ofile")) {
|
||||
i++;
|
||||
if (i == arg.length) {
|
||||
continue;
|
||||
}
|
||||
outputFile = new File(StringUtils.eventuallyRemoveStartingAndEndingDoubleQuote(arg[i]));
|
||||
} else if (s.equalsIgnoreCase("-graphvizdot") || s.equalsIgnoreCase("-graphviz_dot")) {
|
||||
i++;
|
||||
if (i == arg.length) {
|
||||
@ -128,6 +144,20 @@ public class Option {
|
||||
continue;
|
||||
}
|
||||
excludes.add(StringUtils.eventuallyRemoveStartingAndEndingDoubleQuote(arg[i]));
|
||||
} else if (s.equalsIgnoreCase("-nbthread") || s.equalsIgnoreCase("-nbthreads")) {
|
||||
i++;
|
||||
if (i == arg.length) {
|
||||
continue;
|
||||
}
|
||||
final String nb = arg[i];
|
||||
if ("auto".equalsIgnoreCase(nb)) {
|
||||
this.nbThreads = defaultNbThreads();
|
||||
} else if (nb.matches("\\d+")) {
|
||||
this.nbThreads = Integer.parseInt(nb);
|
||||
}
|
||||
} else if (s.equalsIgnoreCase("-checkonly")) {
|
||||
this.checkOnly = true;
|
||||
OptionFlags.getInstance().setFailOnError(true);
|
||||
} else if (s.equalsIgnoreCase("-config")) {
|
||||
i++;
|
||||
if (i == arg.length) {
|
||||
@ -153,10 +183,19 @@ public class Option {
|
||||
} else if (s.equalsIgnoreCase("-syntax")) {
|
||||
syntax = true;
|
||||
OptionFlags.getInstance().setQuiet(true);
|
||||
} else if (s.equalsIgnoreCase("-duration")) {
|
||||
duration = true;
|
||||
} else if (s.equalsIgnoreCase("-keepfiles") || s.equalsIgnoreCase("-keepfile")) {
|
||||
OptionFlags.getInstance().setKeepTmpFiles(true);
|
||||
} else if (s.equalsIgnoreCase("-metadata")) {
|
||||
OptionFlags.getInstance().setMetadata(true);
|
||||
} else if (s.equalsIgnoreCase("-logdata")) {
|
||||
i++;
|
||||
if (i == arg.length) {
|
||||
continue;
|
||||
}
|
||||
OptionFlags.getInstance().setLogData(
|
||||
new File(StringUtils.eventuallyRemoveStartingAndEndingDoubleQuote(arg[i])));
|
||||
} else if (s.equalsIgnoreCase("-word")) {
|
||||
OptionFlags.getInstance().setWord(true);
|
||||
OptionFlags.getInstance().setQuiet(true);
|
||||
@ -184,12 +223,29 @@ public class Option {
|
||||
OptionPrint.printLanguage();
|
||||
} else if (s.equalsIgnoreCase("-gui")) {
|
||||
OptionFlags.getInstance().setGui(true);
|
||||
} else if (s.equalsIgnoreCase("-nosuggestengine")) {
|
||||
OptionFlags.getInstance().setUseSuggestEngine(false);
|
||||
} else if (s.equalsIgnoreCase("-failonerror")) {
|
||||
OptionFlags.getInstance().setFailOnError(true);
|
||||
} else if (s.equalsIgnoreCase("-printfonts")) {
|
||||
OptionFlags.getInstance().setPrintFonts(true);
|
||||
} else if (s.toLowerCase().startsWith("-ftp")) {
|
||||
final int x = s.indexOf(':');
|
||||
if (x == -1) {
|
||||
this.ftpPort = 4242;
|
||||
} else {
|
||||
this.ftpPort = Integer.parseInt(s.substring(x + 1));
|
||||
}
|
||||
} else {
|
||||
result.add(s);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public int getFtpPort() {
|
||||
return ftpPort;
|
||||
}
|
||||
|
||||
public void initConfig(String filename) throws IOException {
|
||||
BufferedReader br = null;
|
||||
try {
|
||||
@ -298,4 +354,32 @@ public class Option {
|
||||
return new FileFormatOption(getFileFormat());
|
||||
}
|
||||
|
||||
public final boolean isDuration() {
|
||||
return duration;
|
||||
}
|
||||
|
||||
public final int getNbThreads() {
|
||||
return nbThreads;
|
||||
}
|
||||
|
||||
public final void setNbThreads(int nb) {
|
||||
this.nbThreads = nb;
|
||||
}
|
||||
|
||||
public static int defaultNbThreads() {
|
||||
return Runtime.getRuntime().availableProcessors();
|
||||
}
|
||||
|
||||
public final boolean isCheckOnly() {
|
||||
return checkOnly;
|
||||
}
|
||||
|
||||
public final void setCheckOnly(boolean checkOnly) {
|
||||
this.checkOnly = checkOnly;
|
||||
}
|
||||
|
||||
public final File getOutputFile() {
|
||||
return outputFile;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -28,26 +28,45 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 6096 $
|
||||
* Revision $Revision: 6922 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.PrintStream;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import net.sourceforge.plantuml.cucadiagram.dot.GraphvizUtils;
|
||||
|
||||
public class OptionFlags {
|
||||
|
||||
static public final boolean PBBACK = false;
|
||||
static public final boolean SUGGEST = true;
|
||||
static public final boolean GRAPHVIZCACHE = false;
|
||||
static public final boolean SVEK = false;
|
||||
|
||||
void reset() {
|
||||
reset(false);
|
||||
}
|
||||
|
||||
private void reset(boolean exit) {
|
||||
keepTmpFiles = false;
|
||||
verbose = false;
|
||||
metadata = false;
|
||||
word = false;
|
||||
systemExit = exit;
|
||||
debugDot = false;
|
||||
forceGd = false;
|
||||
forceCairo = false;
|
||||
quiet = false;
|
||||
dotExecutable = null;
|
||||
gui = false;
|
||||
quiet = false;
|
||||
checkDotError = false;
|
||||
printFonts = false;
|
||||
useSuggestEngine = true;
|
||||
failOnError = false;
|
||||
}
|
||||
|
||||
public boolean useJavaInsteadOfDot() {
|
||||
@ -56,32 +75,36 @@ public class OptionFlags {
|
||||
|
||||
private static final OptionFlags singleton = new OptionFlags();
|
||||
|
||||
private boolean keepTmpFiles = false;
|
||||
private boolean verbose = false;
|
||||
private boolean metadata = false;
|
||||
private boolean word = false;
|
||||
private boolean systemExit = true;
|
||||
private boolean debugDot = false;
|
||||
private boolean forceGd = false;
|
||||
private boolean forceCairo = false;
|
||||
private String dotExecutable = null;
|
||||
private boolean gui = false;
|
||||
private boolean quiet = false;
|
||||
private boolean checkDotError = false;
|
||||
private boolean keepTmpFiles;
|
||||
private boolean verbose;
|
||||
private boolean metadata;
|
||||
private boolean word;
|
||||
private boolean systemExit;
|
||||
private boolean debugDot;
|
||||
private boolean forceGd;
|
||||
private boolean forceCairo;
|
||||
private String dotExecutable;
|
||||
private boolean gui;
|
||||
private boolean quiet;
|
||||
private boolean checkDotError;
|
||||
private boolean printFonts;
|
||||
private boolean useSuggestEngine;
|
||||
private boolean failOnError;
|
||||
private File logData;
|
||||
|
||||
private OptionFlags() {
|
||||
reset();
|
||||
reset(true);
|
||||
}
|
||||
|
||||
public static OptionFlags getInstance() {
|
||||
return singleton;
|
||||
}
|
||||
|
||||
public final boolean isKeepTmpFiles() {
|
||||
public synchronized final boolean isKeepTmpFiles() {
|
||||
return keepTmpFiles;
|
||||
}
|
||||
|
||||
public final void setKeepTmpFiles(boolean keepTmpFiles) {
|
||||
public synchronized final void setKeepTmpFiles(boolean keepTmpFiles) {
|
||||
this.keepTmpFiles = keepTmpFiles;
|
||||
}
|
||||
|
||||
@ -173,4 +196,89 @@ public class OptionFlags {
|
||||
this.checkDotError = checkDotError;
|
||||
}
|
||||
|
||||
private final AtomicBoolean logDataInitized = new AtomicBoolean(false);
|
||||
|
||||
public void logData(File file, PSystem system) {
|
||||
if (system instanceof PSystemError == false) {
|
||||
return;
|
||||
}
|
||||
synchronized (logDataInitized) {
|
||||
if (logData == null && logDataInitized.get() == false) {
|
||||
final String s = GraphvizUtils.getenvLogData();
|
||||
if (s != null) {
|
||||
setLogData(new File(s));
|
||||
}
|
||||
logDataInitized.set(true);
|
||||
}
|
||||
|
||||
if (logData == null) {
|
||||
return;
|
||||
}
|
||||
final PSystemError systemError = (PSystemError) system;
|
||||
PrintStream ps = null;
|
||||
try {
|
||||
ps = new PrintStream(new FileOutputStream(logData, true));
|
||||
ps.println("Start of " + file.getName());
|
||||
ps.println(systemError.getDescription());
|
||||
for (CharSequence t : systemError.getTitle()) {
|
||||
ps.println(t);
|
||||
}
|
||||
systemError.print(ps);
|
||||
for (String s : systemError.getSuggest()) {
|
||||
ps.println(s);
|
||||
}
|
||||
ps.println("End of " + file.getName());
|
||||
ps.println();
|
||||
} catch (FileNotFoundException e) {
|
||||
Log.error("Cannot open " + logData);
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if (ps != null) {
|
||||
ps.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public final void setLogData(File logData) {
|
||||
this.logData = logData;
|
||||
logData.delete();
|
||||
PrintStream ps = null;
|
||||
try {
|
||||
ps = new PrintStream(new FileOutputStream(logData));
|
||||
ps.println();
|
||||
} catch (FileNotFoundException e) {
|
||||
Log.error("Cannot open " + logData);
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if (ps != null) {
|
||||
ps.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public final boolean isPrintFonts() {
|
||||
return printFonts;
|
||||
}
|
||||
|
||||
public final void setPrintFonts(boolean printFonts) {
|
||||
this.printFonts = printFonts;
|
||||
}
|
||||
|
||||
public final boolean isUseSuggestEngine() {
|
||||
return useSuggestEngine;
|
||||
}
|
||||
|
||||
public final void setUseSuggestEngine(boolean useSuggestEngine) {
|
||||
this.useSuggestEngine = useSuggestEngine;
|
||||
}
|
||||
|
||||
public final boolean isFailOnError() {
|
||||
return failOnError;
|
||||
}
|
||||
|
||||
public final void setFailOnError(boolean failOnError) {
|
||||
this.failOnError = failOnError;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 6448 $
|
||||
* Revision $Revision: 6626 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
@ -88,12 +88,18 @@ public class OptionPrint {
|
||||
System.err.println(" -h[elp]\t\tTo display this help message");
|
||||
System.err.println(" -testdot\t\tTo test the installation of graphviz");
|
||||
System.err.println(" -graphvizdot \"exe\"\tTo specify dot executable");
|
||||
System.err.println(" -p[ipe]\t\tTo use stdin for PlantUML source and stdout for PNG/SVG generation");
|
||||
System.err.println(" -p[ipe]\t\tTo use stdin for PlantUML source and stdout for PNG/SVG/EPS generation");
|
||||
System.err.println(" -computeurl\t\tTo compute the encoded URL of a PlantUML source file");
|
||||
System.err.println(" -decodeurl\t\tTo retrieve the PlantUML source from an encoded URL");
|
||||
System.err.println(" -syntax\t\tTo report any syntax error from standard input without generating images");
|
||||
System.err.println(" -language\t\tTo print the list of PlantUML keywords");
|
||||
System.err.println(" -nosuggestengine\tTo disable the suggest engine when errors in diagrams");
|
||||
System.err.println(" -checkonly\t\tTo check the syntax of files without generating images");
|
||||
System.err.println(" -failonerror\tTo stop processing if syntax error in diagram occurs");
|
||||
System.err.println(" -pattern\t\tTo print the list of Regular Expression used by PlantUML");
|
||||
System.err.println(" -duration\t\tTo print the duration of complete diagrams processing");
|
||||
System.err.println(" -nbthread N\tTo use (N) threads for processing");
|
||||
System.err.println(" -nbthread auto\tTo use " + Option.defaultNbThreads() + " threads for processing");
|
||||
System.err.println();
|
||||
System.err.println("If needed, you can setup the environment variable GRAPHVIZ_DOT.");
|
||||
exit();
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 6302 $
|
||||
* Revision $Revision: 6513 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
|
@ -64,6 +64,31 @@ public class PSystemBuilder {
|
||||
|
||||
final public PSystem createPSystem(final List<String> strings) throws IOException, InterruptedException {
|
||||
|
||||
final List<PSystemFactory> factories = getAllFactories();
|
||||
|
||||
final UmlSource umlSource = new UmlSource(strings);
|
||||
final DiagramType diagramType = umlSource.getDiagramType();
|
||||
final List<PSystemError> errors = new ArrayList<PSystemError>();
|
||||
for (PSystemFactory systemFactory : factories) {
|
||||
if (diagramType != systemFactory.getDiagramType()) {
|
||||
continue;
|
||||
}
|
||||
final PSystem sys = new PSystemSingleBuilder(umlSource, systemFactory).getPSystem();
|
||||
if (isOk(sys)) {
|
||||
return sys;
|
||||
}
|
||||
errors.add((PSystemError) sys);
|
||||
}
|
||||
|
||||
final PSystemError err = merge(errors);
|
||||
if (OptionFlags.getInstance().isQuiet() == false) {
|
||||
err.print(System.err);
|
||||
}
|
||||
return err;
|
||||
|
||||
}
|
||||
|
||||
private List<PSystemFactory> getAllFactories() {
|
||||
final List<PSystemFactory> factories = new ArrayList<PSystemFactory>();
|
||||
factories.add(new SequenceDiagramFactory());
|
||||
factories.add(new ClassDiagramFactory());
|
||||
@ -89,27 +114,7 @@ public class PSystemBuilder {
|
||||
factories.add(new PSystemPathFactory());
|
||||
factories.add(new PSystemOregonFactory());
|
||||
factories.add(new PSystemProjectFactory());
|
||||
|
||||
final UmlSource umlSource = new UmlSource(strings);
|
||||
final DiagramType diagramType = umlSource.getDiagramType();
|
||||
final List<PSystemError> errors = new ArrayList<PSystemError>();
|
||||
for (PSystemFactory systemFactory : factories) {
|
||||
if (diagramType != systemFactory.getDiagramType()) {
|
||||
continue;
|
||||
}
|
||||
final PSystem sys = new PSystemSingleBuilder(umlSource, systemFactory).getPSystem();
|
||||
if (isOk(sys)) {
|
||||
return sys;
|
||||
}
|
||||
errors.add((PSystemError) sys);
|
||||
}
|
||||
|
||||
final PSystemError err = merge(errors);
|
||||
if (OptionFlags.getInstance().isQuiet() == false) {
|
||||
err.print(System.err);
|
||||
}
|
||||
return err;
|
||||
|
||||
return factories;
|
||||
}
|
||||
|
||||
private PSystemError merge(Collection<PSystemError> ps) {
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 6453 $
|
||||
* Revision $Revision: 6622 $
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
|
||||
@ -76,24 +76,8 @@ public class PSystemError extends AbstractPSystem {
|
||||
this(source, Collections.singletonList(singleError));
|
||||
}
|
||||
|
||||
// public List<File> createFiles(File suggestedFile, FileFormatOption fileFormat) throws IOException,
|
||||
// InterruptedException {
|
||||
// if (suggestedFile.exists() && suggestedFile.isDirectory()) {
|
||||
// throw new IllegalArgumentException("File is a directory " + suggestedFile);
|
||||
// }
|
||||
// OutputStream os = null;
|
||||
// try {
|
||||
// os = new FileOutputStream(suggestedFile);
|
||||
// getPngError().writeImage(os, getMetadata(), fileFormat);
|
||||
// } finally {
|
||||
// if (os != null) {
|
||||
// os.close();
|
||||
// }
|
||||
// }
|
||||
// return Arrays.asList(suggestedFile);
|
||||
// }
|
||||
|
||||
public void exportDiagram(OutputStream os, StringBuilder cmap, int index, FileFormatOption fileFormat) throws IOException {
|
||||
public void exportDiagram(OutputStream os, StringBuilder cmap, int index, FileFormatOption fileFormat)
|
||||
throws IOException {
|
||||
getPngError().writeImage(os, getMetadata(), fileFormat);
|
||||
}
|
||||
|
||||
@ -137,21 +121,36 @@ public class PSystemError extends AbstractPSystem {
|
||||
htmlStrings.add(" <color:red>" + er);
|
||||
plainStrings.add(" " + er);
|
||||
}
|
||||
boolean first = true;
|
||||
for (String s : getSuggest()) {
|
||||
if (first) {
|
||||
htmlStrings.add(" <color:white><i>" + s);
|
||||
} else {
|
||||
htmlStrings.add("<color:white>" + StringUtils.hideComparatorCharacters(s));
|
||||
}
|
||||
first = false;
|
||||
}
|
||||
}
|
||||
|
||||
public List<String> getSuggest() {
|
||||
boolean suggested = false;
|
||||
for (ErrorUml er : printedErrors) {
|
||||
if (er.hasSuggest()) {
|
||||
suggested = true;
|
||||
}
|
||||
}
|
||||
if (suggested) {
|
||||
htmlStrings.add(" <color:white><i>Did you mean:");
|
||||
if (suggested == false) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
final List<String> result = new ArrayList<String>();
|
||||
result.add("Did you mean:");
|
||||
for (ErrorUml er : printedErrors) {
|
||||
if (er.hasSuggest()) {
|
||||
htmlStrings.add("<color:white>"
|
||||
+ StringUtils.hideComparatorCharacters(er.getSuggest().getSuggestedLine()));
|
||||
}
|
||||
result.add(er.getSuggest().getSuggestedLine());
|
||||
}
|
||||
}
|
||||
return Collections.unmodifiableList(result);
|
||||
|
||||
}
|
||||
|
||||
private Collection<ErrorUml> getErrors(ErrorUmlType type, List<ErrorUml> all) {
|
||||
@ -192,10 +191,12 @@ public class PSystemError extends AbstractPSystem {
|
||||
}
|
||||
|
||||
public void print(PrintStream ps) {
|
||||
synchronized (ps) {
|
||||
for (String s : plainStrings) {
|
||||
ps.println(StringUtils.showComparatorCharacters(s));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public final int getHigherErrorPosition() {
|
||||
return higherErrorPosition;
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 6341 $
|
||||
* Revision $Revision: 6750 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
@ -37,7 +37,7 @@ public interface PSystemFactory {
|
||||
|
||||
PSystem getSystem();
|
||||
|
||||
void reset();
|
||||
void init(String startLine);
|
||||
|
||||
DiagramType getDiagramType();
|
||||
|
||||
|
@ -53,6 +53,7 @@ final public class PSystemSingleBuilder {
|
||||
|
||||
private final Iterator<String> it;
|
||||
private final UmlSource source;
|
||||
private final String startLine;
|
||||
|
||||
private int nb = 0;
|
||||
private AbstractPSystem sys;
|
||||
@ -73,7 +74,8 @@ final public class PSystemSingleBuilder {
|
||||
public PSystemSingleBuilder(UmlSource s, PSystemFactory systemFactory) throws IOException {
|
||||
this.source = s;
|
||||
it = s.iterator();
|
||||
if (StartUtils.isArobaseStartDiagram(next()) == false) {
|
||||
startLine = next();
|
||||
if (StartUtils.isArobaseStartDiagram(startLine) == false) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@ -87,7 +89,7 @@ final public class PSystemSingleBuilder {
|
||||
}
|
||||
|
||||
private void executeUmlBasic(PSystemBasicFactory systemFactory) throws IOException {
|
||||
systemFactory.reset();
|
||||
systemFactory.init(startLine);
|
||||
while (hasNext()) {
|
||||
final String s = next();
|
||||
if (StartUtils.isArobaseEndDiagram(s)) {
|
||||
@ -127,7 +129,7 @@ final public class PSystemSingleBuilder {
|
||||
}
|
||||
|
||||
private void executeUmlCommand(PSystemCommandFactory systemFactory) throws IOException {
|
||||
systemFactory.reset();
|
||||
systemFactory.init(startLine);
|
||||
while (hasNext()) {
|
||||
final String s = next();
|
||||
if (StartUtils.isArobaseEndDiagram(s)) {
|
||||
@ -150,7 +152,7 @@ final public class PSystemSingleBuilder {
|
||||
final CommandControl commandControl = systemFactory.isValid(Arrays.asList(s));
|
||||
if (commandControl == CommandControl.NOT_OK) {
|
||||
final ErrorUml err = new ErrorUml(ErrorUmlType.SYNTAX_ERROR, "Syntax Error?", nb - 1);
|
||||
if (OptionFlags.SUGGEST) {
|
||||
if (OptionFlags.getInstance().isUseSuggestEngine()) {
|
||||
final SuggestEngine engine = new SuggestEngine(source, systemFactory);
|
||||
final SuggestEngineResult result = engine.tryToSuggest();
|
||||
if (result.getStatus() == SuggestEngineStatus.ONE_SUGGESTION) {
|
||||
|
@ -28,11 +28,12 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 6234 $
|
||||
* Revision $Revision: 6750 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
|
||||
import java.awt.Font;
|
||||
import java.awt.GraphicsEnvironment;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
@ -40,6 +41,11 @@ import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.PrintStream;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.Future;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import javax.swing.UIManager;
|
||||
|
||||
@ -49,21 +55,34 @@ import net.sourceforge.plantuml.code.Transcoder;
|
||||
import net.sourceforge.plantuml.code.TranscoderUtil;
|
||||
import net.sourceforge.plantuml.command.AbstractUmlSystemCommandFactory;
|
||||
import net.sourceforge.plantuml.componentdiagram.ComponentDiagramFactory;
|
||||
import net.sourceforge.plantuml.ftp.FtpServer;
|
||||
import net.sourceforge.plantuml.objectdiagram.ObjectDiagramFactory;
|
||||
import net.sourceforge.plantuml.png.MetadataTag;
|
||||
import net.sourceforge.plantuml.preproc.Defines;
|
||||
import net.sourceforge.plantuml.sequencediagram.SequenceDiagramFactory;
|
||||
import net.sourceforge.plantuml.statediagram.StateDiagramFactory;
|
||||
import net.sourceforge.plantuml.swing.MainWindow;
|
||||
import net.sourceforge.plantuml.swing.MainWindow2;
|
||||
import net.sourceforge.plantuml.usecasediagram.UsecaseDiagramFactory;
|
||||
|
||||
public class Run {
|
||||
|
||||
public static void main(String[] argsArray) throws IOException, InterruptedException {
|
||||
final long start = System.currentTimeMillis();
|
||||
final Option option = new Option(argsArray);
|
||||
if (OptionFlags.getInstance().isVerbose()) {
|
||||
Log.info("GraphicsEnvironment.isHeadless() " + GraphicsEnvironment.isHeadless());
|
||||
}
|
||||
if (OptionFlags.getInstance().isPrintFonts()) {
|
||||
printFonts();
|
||||
return;
|
||||
}
|
||||
|
||||
if (option.getFtpPort() != -1) {
|
||||
goFtp(option);
|
||||
return;
|
||||
}
|
||||
|
||||
boolean error = false;
|
||||
if (option.isPattern()) {
|
||||
managePattern();
|
||||
} else if (OptionFlags.getInstance().isGui()) {
|
||||
@ -71,12 +90,42 @@ public class Run {
|
||||
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
|
||||
} catch (Exception e) {
|
||||
}
|
||||
new MainWindow(option);
|
||||
new MainWindow2(option);
|
||||
} else if (option.isPipe() || option.isSyntax()) {
|
||||
managePipe(option);
|
||||
} else {
|
||||
manageFiles(option);
|
||||
error = manageAllFiles(option);
|
||||
}
|
||||
|
||||
if (option.isDuration()) {
|
||||
final long duration = System.currentTimeMillis() - start;
|
||||
Log.error("Duration = " + (duration / 1000L) + " seconds");
|
||||
}
|
||||
|
||||
if (error) {
|
||||
Log.error("Some diagram description contains errors");
|
||||
System.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
private static void goFtp(Option option) throws IOException {
|
||||
final int ftpPort = option.getFtpPort();
|
||||
System.err.println("ftpPort=" + ftpPort);
|
||||
final FtpServer ftpServer = new FtpServer(ftpPort);
|
||||
ftpServer.go();
|
||||
}
|
||||
|
||||
static void printFonts() {
|
||||
final Font fonts[] = GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts();
|
||||
for (Font f : fonts) {
|
||||
System.out.println("f=" + f + "/" + f.getPSName() + "/" + f.getName() + "/" + f.getFontName() + "/"
|
||||
+ f.getFamily());
|
||||
}
|
||||
final String name[] = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
|
||||
for (String n : name) {
|
||||
System.out.println("n=" + n);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static void managePattern() {
|
||||
@ -90,6 +139,7 @@ public class Run {
|
||||
}
|
||||
|
||||
private static void printPattern(AbstractUmlSystemCommandFactory factory) {
|
||||
factory.init(null);
|
||||
System.out.println();
|
||||
System.out.println(factory.getClass().getSimpleName().replaceAll("Factory", ""));
|
||||
for (String s : factory.getDescription()) {
|
||||
@ -146,30 +196,7 @@ public class Run {
|
||||
}
|
||||
}
|
||||
|
||||
private static void manageFile(File f, Option option) throws IOException, InterruptedException {
|
||||
if (OptionFlags.getInstance().isMetadata()) {
|
||||
System.out.println("------------------------");
|
||||
System.out.println(f);
|
||||
// new Metadata().readAndDisplayMetadata(f);
|
||||
System.out.println();
|
||||
System.out.println(new MetadataTag(f, "plantuml").getData());
|
||||
System.out.println("------------------------");
|
||||
} else {
|
||||
final SourceFileReader sourceFileReader = new SourceFileReader(option.getDefaultDefines(), f,
|
||||
option.getOutputDir(), option.getConfig(), option.getCharset(), option.getFileFormatOption());
|
||||
if (option.isComputeurl()) {
|
||||
final List<String> urls = sourceFileReader.getEncodedUrl();
|
||||
for (String s : urls) {
|
||||
System.out.println(s);
|
||||
}
|
||||
} else {
|
||||
sourceFileReader.getGeneratedImages();
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void manageFiles(Option option) throws IOException, InterruptedException {
|
||||
private static boolean manageAllFiles(Option option) throws IOException, InterruptedException {
|
||||
|
||||
File lockFile = null;
|
||||
try {
|
||||
@ -179,7 +206,7 @@ public class Run {
|
||||
javaIsRunningFile.delete();
|
||||
lockFile = new File(dir, "javaumllock.tmp");
|
||||
}
|
||||
processArgs(option);
|
||||
return processArgs(option);
|
||||
} finally {
|
||||
if (lockFile != null) {
|
||||
lockFile.delete();
|
||||
@ -188,7 +215,11 @@ public class Run {
|
||||
|
||||
}
|
||||
|
||||
private static void processArgs(Option option) throws IOException, InterruptedException {
|
||||
private static boolean processArgs(Option option) throws IOException, InterruptedException {
|
||||
if (option.isDecodeurl() == false && option.getNbThreads() > 0 && option.isCheckOnly() == false
|
||||
&& OptionFlags.getInstance().isMetadata() == false) {
|
||||
return multithread(option);
|
||||
}
|
||||
for (String s : option.getResult()) {
|
||||
if (option.isDecodeurl()) {
|
||||
final Transcoder transcoder = TranscoderUtil.getDefaultTranscoder();
|
||||
@ -198,10 +229,90 @@ public class Run {
|
||||
} else {
|
||||
final FileGroup group = new FileGroup(s, option.getExcludes(), option);
|
||||
for (File f : group.getFiles()) {
|
||||
manageFile(f, option);
|
||||
try {
|
||||
final boolean error = manageFileInternal(f, option);
|
||||
if (error) {
|
||||
return true;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private static boolean multithread(final Option option) throws InterruptedException {
|
||||
Log.info("Using several threads: " + option.getNbThreads());
|
||||
final ExecutorService executor = Executors.newFixedThreadPool(option.getNbThreads());
|
||||
final AtomicBoolean errors = new AtomicBoolean(false);
|
||||
for (String s : option.getResult()) {
|
||||
final FileGroup group = new FileGroup(s, option.getExcludes(), option);
|
||||
for (final File f : group.getFiles()) {
|
||||
final Future<?> future = executor.submit(new Runnable() {
|
||||
public void run() {
|
||||
if (errors.get()) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
final boolean error = manageFileInternal(f, option);
|
||||
if (error) {
|
||||
errors.set(true);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
executor.shutdown();
|
||||
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
|
||||
return errors.get();
|
||||
}
|
||||
|
||||
private static boolean manageFileInternal(File f, Option option) throws IOException, InterruptedException {
|
||||
if (OptionFlags.getInstance().isMetadata()) {
|
||||
System.out.println("------------------------");
|
||||
System.out.println(f);
|
||||
// new Metadata().readAndDisplayMetadata(f);
|
||||
System.out.println();
|
||||
System.out.println(new MetadataTag(f, "plantuml").getData());
|
||||
System.out.println("------------------------");
|
||||
return false;
|
||||
}
|
||||
final ISourceFileReader sourceFileReader;
|
||||
if (option.getOutputFile() == null) {
|
||||
sourceFileReader = new SourceFileReader(option.getDefaultDefines(), f, option.getOutputDir(), option
|
||||
.getConfig(), option.getCharset(), option.getFileFormatOption());
|
||||
} else {
|
||||
sourceFileReader = new SourceFileReader2(option.getDefaultDefines(), f, option.getOutputFile(), option
|
||||
.getConfig(), option.getCharset(), option.getFileFormatOption());
|
||||
}
|
||||
if (option.isComputeurl()) {
|
||||
final List<String> urls = sourceFileReader.getEncodedUrl();
|
||||
for (String s : urls) {
|
||||
System.out.println(s);
|
||||
}
|
||||
return false;
|
||||
} else if (option.isCheckOnly()) {
|
||||
return sourceFileReader.hasError();
|
||||
}
|
||||
final List<GeneratedImage> result = sourceFileReader.getGeneratedImages();
|
||||
if (OptionFlags.getInstance().isFailOnError()) {
|
||||
for (GeneratedImage i : result) {
|
||||
if (i.isError()) {
|
||||
Log.error("Error in file: " + f.getCanonicalPath());
|
||||
}
|
||||
if (i.isError() && OptionFlags.getInstance().isFailOnError()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 6448 $
|
||||
* Revision $Revision: 6866 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
@ -46,7 +46,12 @@ import java.util.regex.Pattern;
|
||||
|
||||
import net.sourceforge.plantuml.cucadiagram.dot.DotSplines;
|
||||
import net.sourceforge.plantuml.cucadiagram.dot.GraphvizLayoutStrategy;
|
||||
import net.sourceforge.plantuml.graphic.HorizontalAlignement;
|
||||
import net.sourceforge.plantuml.graphic.HtmlColor;
|
||||
import net.sourceforge.plantuml.ugraphic.ColorMapper;
|
||||
import net.sourceforge.plantuml.ugraphic.ColorMapperIdentity;
|
||||
import net.sourceforge.plantuml.ugraphic.ColorMapperMonochrome;
|
||||
import net.sourceforge.plantuml.ugraphic.UFont;
|
||||
|
||||
public class SkinParam implements ISkinParam {
|
||||
|
||||
@ -74,7 +79,7 @@ public class SkinParam implements ISkinParam {
|
||||
public HtmlColor getBackgroundColor() {
|
||||
final HtmlColor result = getHtmlColor(ColorParam.background, null);
|
||||
if (result == null) {
|
||||
return HtmlColor.getColorIfValid("white");
|
||||
return HtmlColor.WHITE;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@ -119,7 +124,7 @@ public class SkinParam implements ISkinParam {
|
||||
}
|
||||
}
|
||||
|
||||
public int getFontSize(FontParam param, String stereotype) {
|
||||
private int getFontSize(FontParam param, String stereotype) {
|
||||
if (stereotype != null) {
|
||||
checkStereotype(stereotype);
|
||||
final String value2 = getValue(param.name() + "fontsize" + stereotype);
|
||||
@ -132,12 +137,12 @@ public class SkinParam implements ISkinParam {
|
||||
value = getValue("defaultfontsize");
|
||||
}
|
||||
if (value == null || value.matches("\\d+") == false) {
|
||||
return param.getDefaultSize();
|
||||
return param.getDefaultSize(this);
|
||||
}
|
||||
return Integer.parseInt(value);
|
||||
}
|
||||
|
||||
public String getFontFamily(FontParam param, String stereotype) {
|
||||
private String getFontFamily(FontParam param, String stereotype) {
|
||||
if (stereotype != null) {
|
||||
checkStereotype(stereotype);
|
||||
final String value2 = getValue(param.name() + "fontname" + stereotype);
|
||||
@ -177,7 +182,7 @@ public class SkinParam implements ISkinParam {
|
||||
return HtmlColor.getColorIfValid(value);
|
||||
}
|
||||
|
||||
public int getFontStyle(FontParam param, String stereotype) {
|
||||
private int getFontStyle(FontParam param, String stereotype) {
|
||||
String value = null;
|
||||
if (stereotype != null) {
|
||||
checkStereotype(stereotype);
|
||||
@ -190,7 +195,7 @@ public class SkinParam implements ISkinParam {
|
||||
value = getValue("defaultfontstyle");
|
||||
}
|
||||
if (value == null) {
|
||||
return param.getDefaultFontStyle();
|
||||
return param.getDefaultFontStyle(this);
|
||||
}
|
||||
int result = Font.PLAIN;
|
||||
if (value.toLowerCase().contains("bold")) {
|
||||
@ -202,12 +207,12 @@ public class SkinParam implements ISkinParam {
|
||||
return result;
|
||||
}
|
||||
|
||||
public Font getFont(FontParam fontParam, String stereotype) {
|
||||
public UFont getFont(FontParam fontParam, String stereotype) {
|
||||
if (stereotype != null) {
|
||||
checkStereotype(stereotype);
|
||||
}
|
||||
return new Font(getFontFamily(fontParam, stereotype), getFontStyle(fontParam, stereotype), getFontSize(
|
||||
fontParam, stereotype));
|
||||
return new UFont(getFontFamily(fontParam, stereotype), getFontStyle(fontParam, stereotype),
|
||||
getFontSize(fontParam, stereotype));
|
||||
}
|
||||
|
||||
public int getCircledCharacterRadius() {
|
||||
@ -233,7 +238,7 @@ public class SkinParam implements ISkinParam {
|
||||
return 10;
|
||||
}
|
||||
|
||||
public boolean isMonochrome() {
|
||||
private boolean isMonochrome() {
|
||||
return "true".equals(getValue("monochrome"));
|
||||
}
|
||||
|
||||
@ -312,4 +317,20 @@ public class SkinParam implements ISkinParam {
|
||||
return GraphvizLayoutStrategy.DOT;
|
||||
}
|
||||
|
||||
public HorizontalAlignement getHorizontalAlignement(AlignParam param) {
|
||||
final String value = getValue(param.name());
|
||||
final HorizontalAlignement result = HorizontalAlignement.fromString(value);
|
||||
if (result == null) {
|
||||
return param.getDefaultValue();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public ColorMapper getColorMapper() {
|
||||
if (isMonochrome()) {
|
||||
return new ColorMapperMonochrome();
|
||||
}
|
||||
return new ColorMapperIdentity();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -33,11 +33,12 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
|
||||
import java.awt.Font;
|
||||
|
||||
import net.sourceforge.plantuml.cucadiagram.dot.DotSplines;
|
||||
import net.sourceforge.plantuml.cucadiagram.dot.GraphvizLayoutStrategy;
|
||||
import net.sourceforge.plantuml.graphic.HorizontalAlignement;
|
||||
import net.sourceforge.plantuml.graphic.HtmlColor;
|
||||
import net.sourceforge.plantuml.ugraphic.ColorMapper;
|
||||
import net.sourceforge.plantuml.ugraphic.UFont;
|
||||
|
||||
public class SkinParamBackcolored implements ISkinParam {
|
||||
|
||||
@ -67,26 +68,14 @@ public class SkinParamBackcolored implements ISkinParam {
|
||||
return skinParam.getCircledCharacterRadius();
|
||||
}
|
||||
|
||||
public Font getFont(FontParam fontParam, String stereotype) {
|
||||
public UFont getFont(FontParam fontParam, String stereotype) {
|
||||
return skinParam.getFont(fontParam, stereotype);
|
||||
}
|
||||
|
||||
public String getFontFamily(FontParam param, String stereotype) {
|
||||
return skinParam.getFontFamily(param, stereotype);
|
||||
}
|
||||
|
||||
public HtmlColor getFontHtmlColor(FontParam param, String stereotype) {
|
||||
return skinParam.getFontHtmlColor(param, stereotype);
|
||||
}
|
||||
|
||||
public int getFontSize(FontParam param, String stereotype) {
|
||||
return skinParam.getFontSize(param, stereotype);
|
||||
}
|
||||
|
||||
public int getFontStyle(FontParam param, String stereotype) {
|
||||
return skinParam.getFontStyle(param, stereotype);
|
||||
}
|
||||
|
||||
public HtmlColor getHtmlColor(ColorParam param, String stereotype) {
|
||||
if (param.isBackground() && backColorElement != null) {
|
||||
return backColorElement;
|
||||
@ -106,10 +95,6 @@ public class SkinParamBackcolored implements ISkinParam {
|
||||
return skinParam.classAttributeIconSize();
|
||||
}
|
||||
|
||||
public boolean isMonochrome() {
|
||||
return skinParam.isMonochrome();
|
||||
}
|
||||
|
||||
public int getDpi() {
|
||||
return skinParam.getDpi();
|
||||
}
|
||||
@ -125,4 +110,13 @@ public class SkinParamBackcolored implements ISkinParam {
|
||||
public GraphvizLayoutStrategy getStrategy() {
|
||||
return skinParam.getStrategy();
|
||||
}
|
||||
|
||||
public HorizontalAlignement getHorizontalAlignement(AlignParam param) {
|
||||
return skinParam.getHorizontalAlignement(param);
|
||||
}
|
||||
|
||||
public ColorMapper getColorMapper() {
|
||||
return skinParam.getColorMapper();
|
||||
}
|
||||
|
||||
}
|
||||
|
118
src/net/sourceforge/plantuml/SkinParamBackcoloredReference.java
Normal file
118
src/net/sourceforge/plantuml/SkinParamBackcoloredReference.java
Normal file
@ -0,0 +1,118 @@
|
||||
/* ========================================================================
|
||||
* 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: 4246 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
|
||||
import net.sourceforge.plantuml.cucadiagram.dot.DotSplines;
|
||||
import net.sourceforge.plantuml.cucadiagram.dot.GraphvizLayoutStrategy;
|
||||
import net.sourceforge.plantuml.graphic.HorizontalAlignement;
|
||||
import net.sourceforge.plantuml.graphic.HtmlColor;
|
||||
import net.sourceforge.plantuml.ugraphic.ColorMapper;
|
||||
import net.sourceforge.plantuml.ugraphic.UFont;
|
||||
|
||||
public class SkinParamBackcoloredReference implements ISkinParam {
|
||||
|
||||
final private ISkinParam skinParam;
|
||||
final private HtmlColor sequenceReferenceHeaderBackground;
|
||||
final private HtmlColor sequenceReferenceBackground;
|
||||
|
||||
public SkinParamBackcoloredReference(ISkinParam skinParam, HtmlColor sequenceReferenceHeaderBackground,
|
||||
HtmlColor sequenceReferenceBackground) {
|
||||
this.skinParam = skinParam;
|
||||
this.sequenceReferenceBackground = sequenceReferenceBackground;
|
||||
this.sequenceReferenceHeaderBackground = sequenceReferenceHeaderBackground;
|
||||
}
|
||||
|
||||
public HtmlColor getBackgroundColor() {
|
||||
return skinParam.getBackgroundColor();
|
||||
}
|
||||
|
||||
public int getCircledCharacterRadius() {
|
||||
return skinParam.getCircledCharacterRadius();
|
||||
}
|
||||
|
||||
public UFont getFont(FontParam fontParam, String stereotype) {
|
||||
return skinParam.getFont(fontParam, stereotype);
|
||||
}
|
||||
|
||||
public HtmlColor getFontHtmlColor(FontParam param, String stereotype) {
|
||||
return skinParam.getFontHtmlColor(param, stereotype);
|
||||
}
|
||||
|
||||
public HtmlColor getHtmlColor(ColorParam param, String stereotype) {
|
||||
if (param == ColorParam.sequenceReferenceHeaderBackground && sequenceReferenceHeaderBackground != null) {
|
||||
return sequenceReferenceHeaderBackground;
|
||||
}
|
||||
if (param == ColorParam.sequenceReferenceBackground && sequenceReferenceBackground != null) {
|
||||
return sequenceReferenceBackground;
|
||||
}
|
||||
return skinParam.getHtmlColor(param, stereotype);
|
||||
}
|
||||
|
||||
public String getValue(String key) {
|
||||
return skinParam.getValue(key);
|
||||
}
|
||||
|
||||
public boolean isClassCollapse() {
|
||||
return skinParam.isClassCollapse();
|
||||
}
|
||||
|
||||
public int classAttributeIconSize() {
|
||||
return skinParam.classAttributeIconSize();
|
||||
}
|
||||
|
||||
public int getDpi() {
|
||||
return skinParam.getDpi();
|
||||
}
|
||||
|
||||
public boolean useOctagonForActivity() {
|
||||
return skinParam.useOctagonForActivity();
|
||||
}
|
||||
|
||||
public DotSplines getDotSplines() {
|
||||
return skinParam.getDotSplines();
|
||||
}
|
||||
|
||||
public GraphvizLayoutStrategy getStrategy() {
|
||||
return skinParam.getStrategy();
|
||||
}
|
||||
|
||||
public HorizontalAlignement getHorizontalAlignement(AlignParam param) {
|
||||
return skinParam.getHorizontalAlignement(param);
|
||||
}
|
||||
|
||||
public ColorMapper getColorMapper() {
|
||||
return skinParam.getColorMapper();
|
||||
}
|
||||
|
||||
}
|
@ -49,7 +49,7 @@ import net.sourceforge.plantuml.code.Transcoder;
|
||||
import net.sourceforge.plantuml.code.TranscoderUtil;
|
||||
import net.sourceforge.plantuml.preproc.Defines;
|
||||
|
||||
public class SourceFileReader {
|
||||
public class SourceFileReader implements ISourceFileReader {
|
||||
|
||||
private final File file;
|
||||
private final File outputDirectory;
|
||||
@ -62,10 +62,12 @@ public class SourceFileReader {
|
||||
}
|
||||
|
||||
public SourceFileReader(final File file, File outputDirectory) throws IOException {
|
||||
this(new Defines(), file, outputDirectory, Collections.<String> emptyList(), null, new FileFormatOption(FileFormat.PNG));
|
||||
this(new Defines(), file, outputDirectory, Collections.<String> emptyList(), null, new FileFormatOption(
|
||||
FileFormat.PNG));
|
||||
}
|
||||
|
||||
public SourceFileReader(final File file, File outputDirectory, FileFormatOption fileFormatOption) throws IOException {
|
||||
public SourceFileReader(final File file, File outputDirectory, FileFormatOption fileFormatOption)
|
||||
throws IOException {
|
||||
this(new Defines(), file, outputDirectory, Collections.<String> emptyList(), null, fileFormatOption);
|
||||
}
|
||||
|
||||
@ -87,7 +89,16 @@ public class SourceFileReader {
|
||||
}
|
||||
this.outputDirectory = outputDirectory;
|
||||
|
||||
builder = new BlockUmlBuilder(config, defines, getReader(charset));
|
||||
builder = new BlockUmlBuilder(config, defines, getReader(charset), file.getAbsoluteFile().getParentFile());
|
||||
}
|
||||
|
||||
public boolean hasError() throws IOException, InterruptedException {
|
||||
for (final BlockUml b : builder.getBlockUmls()) {
|
||||
if (b.getSystem() instanceof PSystemError) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public List<GeneratedImage> getGeneratedImages() throws IOException, InterruptedException {
|
||||
@ -100,15 +111,18 @@ public class SourceFileReader {
|
||||
String newName = blockUml.getFilename();
|
||||
|
||||
if (newName == null) {
|
||||
newName = changeName(file.getName(), cpt++, fileFormatOption.getFileFormat());
|
||||
newName = fileFormatOption.getFileFormat().changeName(file.getName(), cpt++);
|
||||
}
|
||||
|
||||
final File suggested = new File(outputDirectory, newName);
|
||||
suggested.getParentFile().mkdirs();
|
||||
|
||||
for (File f : blockUml.getSystem().exportDiagrams(suggested, fileFormatOption)) {
|
||||
final String desc = "[" + file.getName() + "] " + blockUml.getSystem().getDescription();
|
||||
final GeneratedImage generatedImage = new GeneratedImage(f, desc);
|
||||
final PSystem system = blockUml.getSystem();
|
||||
OptionFlags.getInstance().logData(file, system);
|
||||
|
||||
for (File f : system.exportDiagrams(suggested, fileFormatOption)) {
|
||||
final String desc = "[" + file.getName() + "] " + system.getDescription();
|
||||
final GeneratedImage generatedImage = new GeneratedImage(f, desc, system);
|
||||
result.add(generatedImage);
|
||||
}
|
||||
|
||||
@ -130,13 +144,6 @@ public class SourceFileReader {
|
||||
return Collections.unmodifiableList(result);
|
||||
}
|
||||
|
||||
static String changeName(String name, int cpt, FileFormat fileFormat) {
|
||||
if (cpt == 0) {
|
||||
return name.replaceAll("\\.\\w+$", fileFormat.getFileSuffix());
|
||||
}
|
||||
return name.replaceAll("\\.\\w+$", "_" + String.format("%03d", cpt) + fileFormat.getFileSuffix());
|
||||
}
|
||||
|
||||
private Reader getReader(String charset) throws FileNotFoundException, UnsupportedEncodingException {
|
||||
if (charset == null) {
|
||||
Log.info("Using default charset");
|
||||
@ -154,5 +161,4 @@ public class SourceFileReader {
|
||||
return builder.getIncludedFiles();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
134
src/net/sourceforge/plantuml/SourceFileReader2.java
Normal file
134
src/net/sourceforge/plantuml/SourceFileReader2.java
Normal file
@ -0,0 +1,134 @@
|
||||
/* ========================================================================
|
||||
* 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: 4771 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.Reader;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import net.sourceforge.plantuml.code.Transcoder;
|
||||
import net.sourceforge.plantuml.code.TranscoderUtil;
|
||||
import net.sourceforge.plantuml.preproc.Defines;
|
||||
|
||||
public class SourceFileReader2 implements ISourceFileReader {
|
||||
|
||||
private final File file;
|
||||
private final File outputFile;
|
||||
|
||||
private final BlockUmlBuilder builder;
|
||||
private FileFormatOption fileFormatOption;
|
||||
|
||||
public SourceFileReader2(Defines defines, final File file, File outputFile, List<String> config,
|
||||
String charset, FileFormatOption fileFormatOption) throws IOException {
|
||||
this.file = file;
|
||||
this.fileFormatOption = fileFormatOption;
|
||||
this.outputFile = outputFile;
|
||||
if (file.exists() == false) {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
FileSystem.getInstance().setCurrentDir(file.getAbsoluteFile().getParentFile());
|
||||
|
||||
builder = new BlockUmlBuilder(config, defines, getReader(charset), file.getAbsoluteFile().getParentFile());
|
||||
}
|
||||
|
||||
public boolean hasError() throws IOException, InterruptedException {
|
||||
for (final BlockUml b : builder.getBlockUmls()) {
|
||||
if (b.getSystem() instanceof PSystemError) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public List<GeneratedImage> getGeneratedImages() throws IOException, InterruptedException {
|
||||
Log.info("Reading file: " + file);
|
||||
|
||||
final List<GeneratedImage> result = new ArrayList<GeneratedImage>();
|
||||
|
||||
for (BlockUml blockUml : builder.getBlockUmls()) {
|
||||
final File suggested = outputFile;
|
||||
|
||||
final PSystem system = blockUml.getSystem();
|
||||
OptionFlags.getInstance().logData(file, system);
|
||||
|
||||
for (File f : system.exportDiagrams(suggested, fileFormatOption)) {
|
||||
final String desc = "[" + file.getName() + "] " + system.getDescription();
|
||||
final GeneratedImage generatedImage = new GeneratedImage(f, desc, system);
|
||||
result.add(generatedImage);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Log.info("Number of image(s): " + result.size());
|
||||
|
||||
return Collections.unmodifiableList(result);
|
||||
}
|
||||
|
||||
public List<String> getEncodedUrl() throws IOException, InterruptedException {
|
||||
final List<String> result = new ArrayList<String>();
|
||||
final Transcoder transcoder = TranscoderUtil.getDefaultTranscoder();
|
||||
for (BlockUml blockUml : builder.getBlockUmls()) {
|
||||
final String source = blockUml.getSystem().getSource().getPlainString();
|
||||
final String encoded = transcoder.encode(source);
|
||||
result.add(encoded);
|
||||
}
|
||||
return Collections.unmodifiableList(result);
|
||||
}
|
||||
|
||||
private Reader getReader(String charset) throws FileNotFoundException, UnsupportedEncodingException {
|
||||
if (charset == null) {
|
||||
Log.info("Using default charset");
|
||||
return new InputStreamReader(new FileInputStream(file));
|
||||
}
|
||||
Log.info("Using charset " + charset);
|
||||
return new InputStreamReader(new FileInputStream(file), charset);
|
||||
}
|
||||
|
||||
public final void setFileFormatOption(FileFormatOption fileFormatOption) {
|
||||
this.fileFormatOption = fileFormatOption;
|
||||
}
|
||||
|
||||
public final Set<File> getIncludedFiles() {
|
||||
return builder.getIncludedFiles();
|
||||
}
|
||||
|
||||
}
|
@ -33,6 +33,7 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
@ -55,7 +56,7 @@ public class SourceStringReader {
|
||||
|
||||
public SourceStringReader(Defines defines, String source, List<String> config) {
|
||||
try {
|
||||
final BlockUmlBuilder builder = new BlockUmlBuilder(config, defines, new StringReader(source));
|
||||
final BlockUmlBuilder builder = new BlockUmlBuilder(config, defines, new StringReader(source), null);
|
||||
this.blocks = builder.getBlockUmls();
|
||||
} catch (IOException e) {
|
||||
throw new IllegalStateException();
|
||||
@ -67,7 +68,7 @@ public class SourceStringReader {
|
||||
}
|
||||
|
||||
public String generateImage(File f) throws IOException {
|
||||
final FileOutputStream os = new FileOutputStream(f);
|
||||
final OutputStream os = new BufferedOutputStream(new FileOutputStream(f));
|
||||
final String result = generateImage(os, 0);
|
||||
os.close();
|
||||
return result;
|
||||
@ -100,7 +101,7 @@ public class SourceStringReader {
|
||||
} catch (InterruptedException e) {
|
||||
return null;
|
||||
}
|
||||
Log.error("numImage is too big = ");
|
||||
Log.error("numImage is too big = " + numImage);
|
||||
return null;
|
||||
|
||||
}
|
||||
|
@ -39,6 +39,6 @@ public interface SpecificBackcolorable {
|
||||
|
||||
public HtmlColor getSpecificBackColor();
|
||||
|
||||
public void setSpecificBackcolor(String specificBackcolor);
|
||||
public void setSpecificBackcolor(HtmlColor specificBackcolor);
|
||||
|
||||
}
|
@ -28,11 +28,12 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 6110 $
|
||||
* Revision $Revision: 6923 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.StringReader;
|
||||
@ -79,7 +80,7 @@ public class StringUtils {
|
||||
return Collections.unmodifiableList(result);
|
||||
}
|
||||
|
||||
public static String getMergedLines(List<String> strings) {
|
||||
public static String getMergedLines(List<? extends CharSequence> strings) {
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
for (int i = 0; i < strings.size(); i++) {
|
||||
sb.append(strings.get(i));
|
||||
@ -107,6 +108,10 @@ public class StringUtils {
|
||||
return input != null && input.trim().length() > 0;
|
||||
}
|
||||
|
||||
public static boolean isNotEmpty(List<? extends CharSequence> input) {
|
||||
return input != null && input.size() > 0;
|
||||
}
|
||||
|
||||
public static boolean isEmpty(String input) {
|
||||
return input == null || input.trim().length() == 0;
|
||||
}
|
||||
@ -212,32 +217,6 @@ public class StringUtils {
|
||||
return s;
|
||||
}
|
||||
|
||||
// private static String cleanLineFromSource(String s) {
|
||||
// if (s.startsWith("\uFEFF")) {
|
||||
// s = s.substring(1);
|
||||
// }
|
||||
// if (s.startsWith("~~")) {
|
||||
// s = s.substring("~~".length());
|
||||
// }
|
||||
// // if (s.startsWith(" * ")) {
|
||||
// // s = s.substring(" * ".length());
|
||||
// // }
|
||||
// s = s.replaceFirst("^\\s+\\* ", "");
|
||||
// if (s.equals(" *")) {
|
||||
// s = "";
|
||||
// }
|
||||
// s = s.trim();
|
||||
// while (s.startsWith(" ") || s.startsWith("/") || s.startsWith("\t") ||
|
||||
// s.startsWith("%") || s.startsWith("/*")) {
|
||||
// if (s.startsWith("/*")) {
|
||||
// s = s.substring(2).trim();
|
||||
// } else {
|
||||
// s = s.substring(1).trim();
|
||||
// }
|
||||
// }
|
||||
// return s;
|
||||
// }
|
||||
|
||||
public static boolean isCJK(char c) {
|
||||
final Character.UnicodeBlock block = Character.UnicodeBlock.of(c);
|
||||
System.err.println(block);
|
||||
@ -329,8 +308,7 @@ public class StringUtils {
|
||||
|
||||
public static String uncommentSource(String source) {
|
||||
final StringReader sr = new StringReader(source);
|
||||
final UncommentReadLine un = new UncommentReadLine(new ReadLineReader(
|
||||
sr));
|
||||
final UncommentReadLine un = new UncommentReadLine(new ReadLineReader(sr));
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
String s = null;
|
||||
try {
|
||||
@ -359,6 +337,64 @@ public class StringUtils {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public static List<String> splitComma(String s) {
|
||||
s = s.trim();
|
||||
if (s.matches("([\\p{L}0-9_.]+|\"[^\"]+\")(\\s*,\\s*([\\p{L}0-9_.]+|\"[^\"]+\"))*") == false) {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
final List<String> result = new ArrayList<String>();
|
||||
final Pattern p = Pattern.compile("([\\p{L}0-9_.]+|\"[^\"]+\")");
|
||||
final Matcher m = p.matcher(s);
|
||||
while (m.find()) {
|
||||
result.add(eventuallyRemoveStartingAndEndingDoubleQuote(m.group(0)));
|
||||
}
|
||||
return Collections.unmodifiableList(result);
|
||||
}
|
||||
|
||||
public static String getAsHtml(Color color) {
|
||||
if (color == null) {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
return getAsHtml(color.getRGB());
|
||||
}
|
||||
|
||||
public static String getAsHtml(int color) {
|
||||
final int v = 0xFFFFFF & color;
|
||||
String s = "000000" + Integer.toHexString(v).toUpperCase();
|
||||
s = s.substring(s.length() - 6);
|
||||
return "#" + s;
|
||||
}
|
||||
|
||||
public static String getUid(String uid1, int uid2) {
|
||||
return uid1 + String.format("%04d", uid2);
|
||||
}
|
||||
|
||||
|
||||
public static List<CharSequence> manageEmbededDiagrams(final List<String> strings) {
|
||||
final List<CharSequence> result = new ArrayList<CharSequence>();
|
||||
final Iterator<String> it = strings.iterator();
|
||||
while (it.hasNext()) {
|
||||
CharSequence s = it.next();
|
||||
if (s.equals("{{")) {
|
||||
final List<String> other = new ArrayList<String>();
|
||||
other.add("@startuml");
|
||||
while (it.hasNext()) {
|
||||
String s2 = it.next();
|
||||
if (s2.equals("}}")) {
|
||||
break;
|
||||
}
|
||||
other.add(s2);
|
||||
}
|
||||
other.add("@enduml");
|
||||
s = new EmbededDiagram(other);
|
||||
}
|
||||
result.add(s);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -28,14 +28,16 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 6382 $
|
||||
* Revision $Revision: 6922 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.io.PrintWriter;
|
||||
@ -48,6 +50,7 @@ import java.util.List;
|
||||
import net.sourceforge.plantuml.code.Compression;
|
||||
import net.sourceforge.plantuml.code.CompressionZlib;
|
||||
import net.sourceforge.plantuml.graphic.HorizontalAlignement;
|
||||
import net.sourceforge.plantuml.pdf.PdfConverter;
|
||||
|
||||
import com.google.zxing.BarcodeFormat;
|
||||
import com.google.zxing.EncodeHintType;
|
||||
@ -64,7 +67,7 @@ public abstract class UmlDiagram extends AbstractPSystem implements PSystem {
|
||||
|
||||
private int minwidth = Integer.MAX_VALUE;
|
||||
|
||||
private List<String> title;
|
||||
private List<? extends CharSequence> title;
|
||||
private List<String> header;
|
||||
private List<String> footer;
|
||||
private HorizontalAlignement headerAlignement = HorizontalAlignement.RIGHT;
|
||||
@ -74,11 +77,11 @@ public abstract class UmlDiagram extends AbstractPSystem implements PSystem {
|
||||
|
||||
private final SkinParam skinParam = new SkinParam();
|
||||
|
||||
final public void setTitle(List<String> strings) {
|
||||
final public void setTitle(List<? extends CharSequence> strings) {
|
||||
this.title = strings;
|
||||
}
|
||||
|
||||
final public List<String> getTitle() {
|
||||
final public List<? extends CharSequence> getTitle() {
|
||||
return title;
|
||||
}
|
||||
|
||||
@ -193,9 +196,24 @@ public abstract class UmlDiagram extends AbstractPSystem implements PSystem {
|
||||
e.printStackTrace();
|
||||
flashcodes = null;
|
||||
}
|
||||
if (fileFormatOption.getFileFormat() == FileFormat.PDF) {
|
||||
exportDiagramInternalPdf(os, cmap, index, flashcodes);
|
||||
return;
|
||||
}
|
||||
exportDiagramInternal(os, cmap, index, fileFormatOption, flashcodes);
|
||||
}
|
||||
|
||||
private void exportDiagramInternalPdf(OutputStream os, StringBuilder cmap, int index, List<BufferedImage> flashcodes)
|
||||
throws IOException {
|
||||
final File svg = FileUtils.createTempFile("pdf", ".svf");
|
||||
final File pdfFile = FileUtils.createTempFile("pdf", ".pdf");
|
||||
final OutputStream fos = new BufferedOutputStream(new FileOutputStream(svg));
|
||||
exportDiagram(fos, cmap, index, new FileFormatOption(FileFormat.SVG));
|
||||
fos.close();
|
||||
PdfConverter.convert(svg, pdfFile);
|
||||
FileUtils.copyToStream(pdfFile, os);
|
||||
}
|
||||
|
||||
protected abstract void exportDiagramInternal(OutputStream os, StringBuilder cmap, int index,
|
||||
FileFormatOption fileFormatOption, List<BufferedImage> flashcodes) throws IOException;
|
||||
|
||||
@ -217,9 +235,6 @@ public abstract class UmlDiagram extends AbstractPSystem implements PSystem {
|
||||
return name.replaceAll("(?i)\\.\\w{3}$", ".cmapx");
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
private List<BufferedImage> exportFlashcodeSimple(String s) throws IOException, WriterException {
|
||||
final QRCodeWriter writer = new QRCodeWriter();
|
||||
final int multiple = 1;
|
||||
@ -299,6 +314,4 @@ public abstract class UmlDiagram extends AbstractPSystem implements PSystem {
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
@ -34,9 +34,12 @@
|
||||
package net.sourceforge.plantuml;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
final public class UmlSource {
|
||||
|
||||
@ -89,4 +92,16 @@ final public class UmlSource {
|
||||
return true;
|
||||
}
|
||||
|
||||
public List<String> getTitle() {
|
||||
final Pattern p = Pattern.compile("(?i)^\\s*title\\s+(.+)$");
|
||||
for (String s : source) {
|
||||
final Matcher m = p.matcher(s);
|
||||
final boolean ok = m.matches();
|
||||
if (ok) {
|
||||
return Arrays.asList(m.group(1));
|
||||
}
|
||||
}
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -28,21 +28,23 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 3823 $
|
||||
* Revision $Revision: 6644 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml;
|
||||
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
public class UniqueSequence {
|
||||
|
||||
private static int cpt = 1;
|
||||
private static final AtomicInteger cpt = new AtomicInteger(1);
|
||||
|
||||
public static void reset() {
|
||||
cpt = 1;
|
||||
cpt.set(0);
|
||||
}
|
||||
|
||||
public static int getValue() {
|
||||
return cpt++;
|
||||
return cpt.addAndGet(1);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -51,6 +51,9 @@ public class CommandElse extends SingleLineCommand<ActivityDiagram> {
|
||||
if (getSystem().getLastEntityConsulted() == null) {
|
||||
return CommandExecutionResult.error("No if for this else");
|
||||
}
|
||||
if (getSystem().getCurrentContext() == null) {
|
||||
return CommandExecutionResult.error("No if for this else");
|
||||
}
|
||||
final IEntity branch = getSystem().getCurrentContext().getBranch();
|
||||
|
||||
getSystem().setLastEntityConsulted(branch);
|
||||
|
@ -50,6 +50,9 @@ public class CommandEndif extends SingleLineCommand<ActivityDiagram> {
|
||||
if (getSystem().getLastEntityConsulted() == null) {
|
||||
return CommandExecutionResult.error("No if for this endif");
|
||||
}
|
||||
if (getSystem().getCurrentContext() == null) {
|
||||
return CommandExecutionResult.error("No if for this endif");
|
||||
}
|
||||
getSystem().endif();
|
||||
|
||||
return CommandExecutionResult.ok();
|
||||
|
@ -50,6 +50,7 @@ import net.sourceforge.plantuml.cucadiagram.Link;
|
||||
import net.sourceforge.plantuml.cucadiagram.LinkDecor;
|
||||
import net.sourceforge.plantuml.cucadiagram.LinkType;
|
||||
import net.sourceforge.plantuml.cucadiagram.Stereotype;
|
||||
import net.sourceforge.plantuml.graphic.HtmlColor;
|
||||
|
||||
public class CommandLinkActivity extends SingleLineCommand2<ActivityDiagram> {
|
||||
|
||||
@ -97,7 +98,7 @@ public class CommandLinkActivity extends SingleLineCommand2<ActivityDiagram> {
|
||||
entity1.setStereotype(new Stereotype(arg2.get("STEREOTYPE").get(0)));
|
||||
}
|
||||
if (arg2.get("BACKCOLOR").get(0) != null) {
|
||||
entity1.setSpecificBackcolor(arg2.get("BACKCOLOR").get(0));
|
||||
entity1.setSpecificBackcolor(HtmlColor.getColorIfValid(arg2.get("BACKCOLOR").get(0)));
|
||||
}
|
||||
|
||||
final IEntity entity2 = getEntity(getSystem(), arg2, false);
|
||||
@ -105,7 +106,7 @@ public class CommandLinkActivity extends SingleLineCommand2<ActivityDiagram> {
|
||||
return CommandExecutionResult.error("No such activity");
|
||||
}
|
||||
if (arg2.get("BACKCOLOR2").get(0) != null) {
|
||||
entity2.setSpecificBackcolor(arg2.get("BACKCOLOR2").get(0));
|
||||
entity2.setSpecificBackcolor(HtmlColor.getColorIfValid(arg2.get("BACKCOLOR2").get(0)));
|
||||
}
|
||||
if (arg2.get("STEREOTYPE2").get(0) != null) {
|
||||
entity2.setStereotype(new Stereotype(arg2.get("STEREOTYPE2").get(0)));
|
||||
|
@ -52,6 +52,7 @@ import net.sourceforge.plantuml.cucadiagram.Link;
|
||||
import net.sourceforge.plantuml.cucadiagram.LinkDecor;
|
||||
import net.sourceforge.plantuml.cucadiagram.LinkType;
|
||||
import net.sourceforge.plantuml.cucadiagram.Stereotype;
|
||||
import net.sourceforge.plantuml.graphic.HtmlColor;
|
||||
|
||||
public class CommandLinkLongActivity extends CommandMultilines2<ActivityDiagram> {
|
||||
|
||||
@ -91,7 +92,7 @@ public class CommandLinkLongActivity extends CommandMultilines2<ActivityDiagram>
|
||||
entity1.setStereotype(new Stereotype(line0.get("STEREOTYPE").get(0)));
|
||||
}
|
||||
if (line0.get("BACKCOLOR").get(0)!=null) {
|
||||
entity1.setSpecificBackcolor(line0.get("BACKCOLOR").get(0));
|
||||
entity1.setSpecificBackcolor(HtmlColor.getColorIfValid(line0.get("BACKCOLOR").get(0)));
|
||||
}
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
|
||||
@ -122,7 +123,7 @@ public class CommandLinkLongActivity extends CommandMultilines2<ActivityDiagram>
|
||||
entity2.setStereotype(new Stereotype(lineLast.get(2)));
|
||||
}
|
||||
if (lineLast.get(3)!=null) {
|
||||
entity2.setSpecificBackcolor(lineLast.get(3));
|
||||
entity2.setSpecificBackcolor(HtmlColor.getColorIfValid(lineLast.get(3)));
|
||||
}
|
||||
|
||||
if (entity1 == null || entity2 == null) {
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 5751 $
|
||||
* Revision $Revision: 6939 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.activitydiagram.command;
|
||||
@ -39,6 +39,7 @@ import net.sourceforge.plantuml.StringUtils;
|
||||
import net.sourceforge.plantuml.activitydiagram.ActivityDiagram;
|
||||
import net.sourceforge.plantuml.command.CommandExecutionResult;
|
||||
import net.sourceforge.plantuml.command.CommandMultilines;
|
||||
import net.sourceforge.plantuml.command.Position;
|
||||
import net.sourceforge.plantuml.cucadiagram.Link;
|
||||
|
||||
public class CommandMultilinesNoteActivityLink extends CommandMultilines<ActivityDiagram> {
|
||||
@ -50,13 +51,13 @@ public class CommandMultilinesNoteActivityLink extends CommandMultilines<Activit
|
||||
public final CommandExecutionResult execute(List<String> lines) {
|
||||
|
||||
final List<String> strings = StringUtils.removeEmptyColumns(lines.subList(1, lines.size() - 1));
|
||||
final String s = StringUtils.getMergedLines(strings);
|
||||
// final String s = StringUtils.getMergedLines(strings);
|
||||
|
||||
final Link link = getSystem().getLastActivityLink();
|
||||
if (link == null) {
|
||||
return CommandExecutionResult.error("Nothing to note");
|
||||
}
|
||||
link.setNote(s);
|
||||
link.addNote(strings, Position.BOTTOM);
|
||||
return CommandExecutionResult.ok();
|
||||
}
|
||||
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 4762 $
|
||||
* Revision $Revision: 6939 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.activitydiagram.command;
|
||||
@ -37,6 +37,7 @@ import java.util.List;
|
||||
|
||||
import net.sourceforge.plantuml.activitydiagram.ActivityDiagram;
|
||||
import net.sourceforge.plantuml.command.CommandExecutionResult;
|
||||
import net.sourceforge.plantuml.command.Position;
|
||||
import net.sourceforge.plantuml.command.SingleLineCommand;
|
||||
import net.sourceforge.plantuml.cucadiagram.Link;
|
||||
|
||||
@ -52,7 +53,7 @@ public class CommandNoteOnActivityLink extends SingleLineCommand<ActivityDiagram
|
||||
if (link == null) {
|
||||
return CommandExecutionResult.error("No link defined");
|
||||
}
|
||||
link.setNote(arg.get(0));
|
||||
link.addNote(arg.get(0), Position.BOTTOM);
|
||||
return CommandExecutionResult.ok();
|
||||
|
||||
}
|
||||
|
@ -83,18 +83,19 @@ public class ActivityDiagram2 extends CucaDiagram {
|
||||
return waitings.size() > 0;
|
||||
}
|
||||
|
||||
public void newActivity(String display) {
|
||||
public void newActivity(String display, Direction direction) {
|
||||
if (waitings.size() == 0) {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
final Entity act = createEntity(getAutoCode(), display, EntityType.ACTIVITY);
|
||||
afterAdd(act);
|
||||
afterAdd(act, direction);
|
||||
|
||||
}
|
||||
|
||||
private final Map<String, IEntity> bars = new HashMap<String, IEntity>();
|
||||
|
||||
public void bar(String bar) {
|
||||
final Direction direction = Direction.DOWN;
|
||||
if (bars.containsKey(bar)) {
|
||||
final IEntity existingBar = bars.get(bar);
|
||||
for (Iterator<IEntity> it = waitings.iterator(); it.hasNext();) {
|
||||
@ -103,7 +104,7 @@ public class ActivityDiagram2 extends CucaDiagram {
|
||||
it.remove();
|
||||
}
|
||||
}
|
||||
afterAdd(existingBar);
|
||||
afterAdd(existingBar, direction);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -113,14 +114,26 @@ public class ActivityDiagram2 extends CucaDiagram {
|
||||
label(bar);
|
||||
final Entity act = createEntity(getAutoCode(), bar, EntityType.SYNCHRO_BAR);
|
||||
bars.put(bar, act);
|
||||
afterAdd(act);
|
||||
afterAdd(act, direction);
|
||||
}
|
||||
|
||||
private void afterAdd(final IEntity dest) {
|
||||
private void afterAdd(final IEntity dest, Direction direction) {
|
||||
for (IEntity last : this.waitings) {
|
||||
// System.err.println("last=" + last);
|
||||
// System.err.println("act=" + act);
|
||||
this.addLink(new Link(last, dest, new LinkType(LinkDecor.ARROW, LinkDecor.NONE), futureLabel, 2));
|
||||
final Link link;
|
||||
if (direction == Direction.DOWN) {
|
||||
link = new Link(last, dest, new LinkType(LinkDecor.ARROW, LinkDecor.NONE), futureLabel, 2);
|
||||
} else if (direction == Direction.RIGHT) {
|
||||
link = new Link(last, dest, new LinkType(LinkDecor.ARROW, LinkDecor.NONE), futureLabel, 1);
|
||||
} else if (direction == Direction.LEFT) {
|
||||
link = new Link(dest, last, new LinkType(LinkDecor.NONE, LinkDecor.ARROW), futureLabel, 1);
|
||||
} else if (direction == Direction.UP) {
|
||||
link = new Link(dest, last, new LinkType(LinkDecor.NONE, LinkDecor.ARROW), futureLabel, 2);
|
||||
} else {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
this.addLink(link);
|
||||
futureLabel = null;
|
||||
}
|
||||
|
||||
@ -239,12 +252,12 @@ public class ActivityDiagram2 extends CucaDiagram {
|
||||
// currentContext.clearPendingsButFirst();
|
||||
}
|
||||
|
||||
public void end() {
|
||||
public void end(Direction direction) {
|
||||
if (waitings.size() == 0) {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
final IEntity act = getOrCreateEntity("end", EntityType.CIRCLE_END);
|
||||
afterAdd(act);
|
||||
afterAdd(act, direction);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -59,6 +59,7 @@ public class ActivityDiagramFactory2 extends AbstractUmlSystemCommandFactory {
|
||||
system = new ActivityDiagram2();
|
||||
|
||||
addCommonCommands(system);
|
||||
addCommand(new CommandEnd2(system));
|
||||
addCommand(new CommandStart2(system));
|
||||
addCommand(new CommandNewActivity2(system));
|
||||
addCommand(new CommandIf2(system));
|
||||
@ -67,7 +68,6 @@ public class ActivityDiagramFactory2 extends AbstractUmlSystemCommandFactory {
|
||||
addCommand(new CommandLabel2(system));
|
||||
addCommand(new CommandGoto2(system));
|
||||
addCommand(new CommandBar2(system));
|
||||
addCommand(new CommandEnd2(system));
|
||||
|
||||
// addCommand(new CommandLinkActivity(system));
|
||||
// addCommand(new CommandPartition(system));
|
||||
|
@ -35,6 +35,7 @@ package net.sourceforge.plantuml.activitydiagram2.command;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import net.sourceforge.plantuml.Direction;
|
||||
import net.sourceforge.plantuml.activitydiagram2.ActivityDiagram2;
|
||||
import net.sourceforge.plantuml.command.CommandExecutionResult;
|
||||
import net.sourceforge.plantuml.command.SingleLineCommand2;
|
||||
@ -49,18 +50,23 @@ public class CommandEnd2 extends SingleLineCommand2<ActivityDiagram2> {
|
||||
}
|
||||
|
||||
static RegexConcat getRegexConcat() {
|
||||
return new RegexConcat(new RegexLeaf("^"),
|
||||
new RegexLeaf("end"),
|
||||
return new RegexConcat(new RegexLeaf("^"), //
|
||||
new RegexLeaf("direction", "([<>^])?\\s*"), //
|
||||
new RegexLeaf("end"), //
|
||||
new RegexLeaf("$"));
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected CommandExecutionResult executeArg(Map<String, RegexPartialMatch> arg) {
|
||||
// if (getSystem().getLastEntityConsulted() == null) {
|
||||
// return CommandExecutionResult.error("No if for this endif");
|
||||
// }
|
||||
getSystem().end();
|
||||
final String sdir = arg.get("direction").get(0);
|
||||
Direction direction = Direction.DOWN;
|
||||
if (sdir != null) {
|
||||
direction = Direction.fromChar(sdir.charAt(0));
|
||||
}
|
||||
getSystem().end(direction);
|
||||
|
||||
return CommandExecutionResult.ok();
|
||||
}
|
||||
|
@ -35,6 +35,8 @@ package net.sourceforge.plantuml.activitydiagram2.command;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import net.sourceforge.plantuml.Direction;
|
||||
import net.sourceforge.plantuml.StringUtils;
|
||||
import net.sourceforge.plantuml.activitydiagram2.ActivityDiagram2;
|
||||
import net.sourceforge.plantuml.command.CommandExecutionResult;
|
||||
import net.sourceforge.plantuml.command.SingleLineCommand;
|
||||
@ -42,7 +44,7 @@ import net.sourceforge.plantuml.command.SingleLineCommand;
|
||||
public class CommandNewActivity2 extends SingleLineCommand<ActivityDiagram2> {
|
||||
|
||||
public CommandNewActivity2(ActivityDiagram2 diagram) {
|
||||
super(diagram, "(?i)^\\s*[-*]\\s*([^\"\\s].*)$");
|
||||
super(diagram, "(?i)^\\s*([-*<>^])\\s*([^\"\\s].*|\\s*\"[^\"\\s].*\")$");
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -55,8 +57,8 @@ public class CommandNewActivity2 extends SingleLineCommand<ActivityDiagram2> {
|
||||
return CommandExecutionResult.error("Unreachable statement");
|
||||
}
|
||||
|
||||
getSystem().newActivity(arg.get(0));
|
||||
getSystem().newActivity(StringUtils.eventuallyRemoveStartingAndEndingDoubleQuote(arg.get(1).trim()),
|
||||
Direction.fromChar(arg.get(0).charAt(0)));
|
||||
return CommandExecutionResult.ok();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -35,6 +35,7 @@ package net.sourceforge.plantuml.activitydiagram2.command;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import net.sourceforge.plantuml.Direction;
|
||||
import net.sourceforge.plantuml.StringUtils;
|
||||
import net.sourceforge.plantuml.activitydiagram2.ActivityDiagram2;
|
||||
import net.sourceforge.plantuml.command.CommandExecutionResult;
|
||||
@ -43,7 +44,7 @@ import net.sourceforge.plantuml.command.CommandMultilines;
|
||||
public class CommandNewMultilinesActivity2 extends CommandMultilines<ActivityDiagram2> {
|
||||
|
||||
public CommandNewMultilinesActivity2(final ActivityDiagram2 system) {
|
||||
super(system, "(?i)^\\s*[-*]\\s*\"\\s*.*$", "(?i)^.*\\s*\"\\s*$");
|
||||
super(system, "(?i)^\\s*[-*<>^]\\s*\"\\s*.*$", "(?i)^.*\\s*\"\\s*$");
|
||||
}
|
||||
|
||||
public final CommandExecutionResult execute(List<String> lines) {
|
||||
@ -56,14 +57,15 @@ public class CommandNewMultilinesActivity2 extends CommandMultilines<ActivityDia
|
||||
}
|
||||
String s = StringUtils.getMergedLines(lines);
|
||||
s = s.trim();
|
||||
assert s.startsWith("-") || s.startsWith("*") ;
|
||||
assert s.startsWith("-") || s.startsWith("*") || s.startsWith("<") || s.startsWith(">") || s.startsWith("^");
|
||||
final Direction direction = Direction.fromChar(s.charAt(0));
|
||||
s = s.substring(1);
|
||||
s = s.trim();
|
||||
assert s.startsWith("\"");
|
||||
assert s.endsWith("\"");
|
||||
s = s.substring(1, s.length() - 2);
|
||||
s = s.substring(1, s.length() - 1);
|
||||
|
||||
getSystem().newActivity(s);
|
||||
getSystem().newActivity(s, direction);
|
||||
return CommandExecutionResult.ok();
|
||||
}
|
||||
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 5877 $
|
||||
* Revision $Revision: 6625 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.ant;
|
||||
@ -38,8 +38,12 @@ import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import net.sourceforge.plantuml.DirWatcher;
|
||||
import net.sourceforge.plantuml.FileFormat;
|
||||
import net.sourceforge.plantuml.GeneratedImage;
|
||||
import net.sourceforge.plantuml.Option;
|
||||
@ -71,6 +75,8 @@ public class PlantUmlTask extends Task {
|
||||
private final Option option = new Option();
|
||||
private List<FileSet> filesets = new ArrayList<FileSet>();
|
||||
private List<FileList> filelists = new ArrayList<FileList>();
|
||||
private AtomicInteger nbFiles = new AtomicInteger(0);
|
||||
private ExecutorService executorService;
|
||||
|
||||
/**
|
||||
* Add a set of files to touch
|
||||
@ -94,14 +100,22 @@ public class PlantUmlTask extends Task {
|
||||
|
||||
try {
|
||||
if (dir != null) {
|
||||
processingSingleDirectory(new File(dir));
|
||||
final File error = processingSingleDirectory(new File(dir));
|
||||
checkError(error);
|
||||
}
|
||||
for (FileSet fileSet : filesets) {
|
||||
manageFileSet(fileSet);
|
||||
final File error = manageFileSet(fileSet);
|
||||
checkError(error);
|
||||
}
|
||||
for (FileList fileList : filelists) {
|
||||
manageFileList(fileList);
|
||||
final File error = manageFileList(fileList);
|
||||
checkError(error);
|
||||
}
|
||||
if (executorService != null) {
|
||||
executorService.shutdown();
|
||||
executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
|
||||
}
|
||||
this.log("Nb images generated: " + nbFiles.get());
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
throw new BuildException(e.toString());
|
||||
@ -112,18 +126,29 @@ public class PlantUmlTask extends Task {
|
||||
|
||||
}
|
||||
|
||||
private void manageFileList(FileList fl) throws IOException, InterruptedException {
|
||||
private void checkError(final File error) throws IOException {
|
||||
if (error != null && OptionFlags.getInstance().isFailOnError()) {
|
||||
this.log("Error in file " + error.getCanonicalPath());
|
||||
throw new BuildException("Error in file " + error.getCanonicalPath());
|
||||
}
|
||||
}
|
||||
|
||||
private File manageFileList(FileList fl) throws IOException, InterruptedException {
|
||||
final File fromDir = fl.getDir(getProject());
|
||||
|
||||
final String[] srcFiles = fl.getFiles(getProject());
|
||||
|
||||
for (String src : srcFiles) {
|
||||
final File f = new File(fromDir, src);
|
||||
processingSingleFile(f);
|
||||
final boolean error = processingSingleFile(f);
|
||||
if (error) {
|
||||
return f;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private void manageFileSet(FileSet fs) throws IOException, InterruptedException {
|
||||
private File manageFileSet(FileSet fs) throws IOException, InterruptedException {
|
||||
final DirectoryScanner ds = fs.getDirectoryScanner(getProject());
|
||||
final File fromDir = fs.getDir(getProject());
|
||||
|
||||
@ -132,37 +157,95 @@ public class PlantUmlTask extends Task {
|
||||
|
||||
for (String src : srcFiles) {
|
||||
final File f = new File(fromDir, src);
|
||||
processingSingleFile(f);
|
||||
final boolean error = processingSingleFile(f);
|
||||
if (error) {
|
||||
return f;
|
||||
}
|
||||
}
|
||||
|
||||
for (String src : srcDirs) {
|
||||
final File dir = new File(fromDir, src);
|
||||
processingSingleDirectory(dir);
|
||||
final File errorFile = processingSingleDirectory(dir);
|
||||
if (errorFile != null) {
|
||||
return errorFile;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
|
||||
}
|
||||
|
||||
private void processingSingleFile(final File f) throws IOException, InterruptedException {
|
||||
private boolean processingSingleFile(final File f) throws IOException, InterruptedException {
|
||||
if (OptionFlags.getInstance().isVerbose()) {
|
||||
this.log("Processing " + f.getAbsolutePath());
|
||||
}
|
||||
final SourceFileReader sourceFileReader = new SourceFileReader(new Defines(), f, option.getOutputDir(), option
|
||||
.getConfig(), option.getCharset(), option.getFileFormatOption());
|
||||
final Collection<GeneratedImage> result = sourceFileReader.getGeneratedImages();
|
||||
for (GeneratedImage g : result) {
|
||||
this.log(g + " " + g.getDescription());
|
||||
|
||||
if (option.isCheckOnly()) {
|
||||
return sourceFileReader.hasError();
|
||||
}
|
||||
if (executorService == null) {
|
||||
return doFile(f, sourceFileReader);
|
||||
}
|
||||
|
||||
private void processingSingleDirectory(File f) throws IOException, InterruptedException {
|
||||
if (f.exists() == false) {
|
||||
final String s = "The file " + f.getAbsolutePath() + " does not exists.";
|
||||
executorService.submit(new Callable<Boolean>() {
|
||||
public Boolean call() throws Exception {
|
||||
return doFile(f, sourceFileReader);
|
||||
}
|
||||
});
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private boolean doFile(final File f, final SourceFileReader sourceFileReader) throws IOException,
|
||||
InterruptedException {
|
||||
final Collection<GeneratedImage> result = sourceFileReader.getGeneratedImages();
|
||||
boolean error = false;
|
||||
for (GeneratedImage g : result) {
|
||||
if (OptionFlags.getInstance().isVerbose()) {
|
||||
myLog(g + " " + g.getDescription());
|
||||
}
|
||||
nbFiles.addAndGet(1);
|
||||
if (g.isError()) {
|
||||
error = true;
|
||||
}
|
||||
}
|
||||
if (error) {
|
||||
myLog("Error: " + f.getCanonicalPath());
|
||||
}
|
||||
if (error && OptionFlags.getInstance().isFailOnError()) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private synchronized void myLog(String s) {
|
||||
this.log(s);
|
||||
}
|
||||
|
||||
private File processingSingleDirectory(File dir) throws IOException, InterruptedException {
|
||||
if (dir.exists() == false) {
|
||||
final String s = "The file " + dir.getAbsolutePath() + " does not exists.";
|
||||
this.log(s);
|
||||
throw new BuildException(s);
|
||||
}
|
||||
final DirWatcher dirWatcher = new DirWatcher(f, option, Option.getPattern());
|
||||
final Collection<GeneratedImage> result = dirWatcher.buildCreatedFiles();
|
||||
for (GeneratedImage g : result) {
|
||||
this.log(g + " " + g.getDescription());
|
||||
for (File f : dir.listFiles()) {
|
||||
if (f.isFile() == false) {
|
||||
continue;
|
||||
}
|
||||
if (fileToProcess(f.getName()) == false) {
|
||||
continue;
|
||||
}
|
||||
final boolean error = processingSingleFile(f);
|
||||
if (error) {
|
||||
return f;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private boolean fileToProcess(String name) {
|
||||
return name.matches(Option.getPattern());
|
||||
}
|
||||
|
||||
public void setDir(String s) {
|
||||
@ -210,6 +293,12 @@ public class PlantUmlTask extends Task {
|
||||
if ("eps".equalsIgnoreCase(s)) {
|
||||
option.setFileFormat(FileFormat.EPS);
|
||||
}
|
||||
if ("pdf".equalsIgnoreCase(s)) {
|
||||
option.setFileFormat(FileFormat.PDF);
|
||||
}
|
||||
if ("eps:text".equalsIgnoreCase(s)) {
|
||||
option.setFileFormat(FileFormat.EPS_TEXT);
|
||||
}
|
||||
if ("svg".equalsIgnoreCase(s)) {
|
||||
option.setFileFormat(FileFormat.SVG);
|
||||
}
|
||||
@ -237,4 +326,35 @@ public class PlantUmlTask extends Task {
|
||||
}
|
||||
}
|
||||
|
||||
public void setNbThread(String s) {
|
||||
if (s != null && s.matches("\\d+")) {
|
||||
option.setNbThreads(Integer.parseInt(s));
|
||||
final int nbThreads = option.getNbThreads();
|
||||
this.executorService = Executors.newFixedThreadPool(nbThreads);
|
||||
}
|
||||
if ("auto".equalsIgnoreCase(s)) {
|
||||
option.setNbThreads(Option.defaultNbThreads());
|
||||
final int nbThreads = option.getNbThreads();
|
||||
this.executorService = Executors.newFixedThreadPool(nbThreads);
|
||||
}
|
||||
}
|
||||
|
||||
public void setNbThreads(String s) {
|
||||
setNbThread(s);
|
||||
}
|
||||
|
||||
public void setSuggestEngine(String s) {
|
||||
OptionFlags.getInstance().setUseSuggestEngine("true".equalsIgnoreCase(s) || "yes".equalsIgnoreCase(s) || "on".equalsIgnoreCase(s));
|
||||
}
|
||||
|
||||
public void setFailOnError(String s) {
|
||||
OptionFlags.getInstance().setFailOnError("true".equalsIgnoreCase(s) || "yes".equalsIgnoreCase(s) || "on".equalsIgnoreCase(s));
|
||||
}
|
||||
|
||||
public void setCheckOnly(String s) {
|
||||
final boolean flag = "true".equalsIgnoreCase(s) || "yes".equalsIgnoreCase(s) || "on".equalsIgnoreCase(s);
|
||||
option.setCheckOnly(true);
|
||||
OptionFlags.getInstance().setFailOnError(flag);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,241 +0,0 @@
|
||||
/* ========================================================================
|
||||
* 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: 5877 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.ant;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
import net.sourceforge.plantuml.DirWatcher;
|
||||
import net.sourceforge.plantuml.FileFormat;
|
||||
import net.sourceforge.plantuml.GeneratedImage;
|
||||
import net.sourceforge.plantuml.Option;
|
||||
import net.sourceforge.plantuml.OptionFlags;
|
||||
import net.sourceforge.plantuml.SourceFileReader;
|
||||
import net.sourceforge.plantuml.preproc.Defines;
|
||||
|
||||
import org.apache.tools.ant.BuildException;
|
||||
import org.apache.tools.ant.DirectoryScanner;
|
||||
import org.apache.tools.ant.Task;
|
||||
import org.apache.tools.ant.types.FileList;
|
||||
import org.apache.tools.ant.types.FileSet;
|
||||
|
||||
// <?xml version="1.0"?>
|
||||
//
|
||||
// <project name="OwnTaskExample" default="main" basedir=".">
|
||||
// <taskdef name="plot" classname="plot.PlotTask" classpath="build"/>
|
||||
//
|
||||
// <target name="main">
|
||||
// <mytask message="Hello World! MyVeryOwnTask works!"/>
|
||||
// </target>
|
||||
// </project>
|
||||
|
||||
// Carriage Return in UTF-8 XML:
|
||||
// Line Feed in UTF-8 XML:
|
||||
public class PlantuTask extends Task {
|
||||
|
||||
private String dir = null;
|
||||
private final Option option = new Option();
|
||||
private List<FileSet> filesets = new ArrayList<FileSet>();
|
||||
private List<FileList> filelists = new ArrayList<FileList>();
|
||||
|
||||
/**
|
||||
* Add a set of files to touch
|
||||
*/
|
||||
public void addFileset(FileSet set) {
|
||||
filesets.add(set);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a filelist to touch
|
||||
*/
|
||||
public void addFilelist(FileList list) {
|
||||
filelists.add(list);
|
||||
}
|
||||
|
||||
// The method executing the task
|
||||
@Override
|
||||
public void execute() throws BuildException {
|
||||
|
||||
this.log("Starting PlantUML");
|
||||
|
||||
try {
|
||||
if (dir != null) {
|
||||
processingSingleDirectory(new File(dir));
|
||||
}
|
||||
for (FileSet fileSet : filesets) {
|
||||
manageFileSet(fileSet);
|
||||
}
|
||||
for (FileList fileList : filelists) {
|
||||
manageFileList(fileList);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
throw new BuildException(e.toString());
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
throw new BuildException(e.toString());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void manageFileList(FileList fl) throws IOException, InterruptedException {
|
||||
final File fromDir = fl.getDir(getProject());
|
||||
|
||||
final String[] srcFiles = fl.getFiles(getProject());
|
||||
|
||||
for (String src : srcFiles) {
|
||||
final File f = new File(fromDir, src);
|
||||
processingSingleFile(f);
|
||||
}
|
||||
}
|
||||
|
||||
private void manageFileSet(FileSet fs) throws IOException, InterruptedException {
|
||||
final DirectoryScanner ds = fs.getDirectoryScanner(getProject());
|
||||
final File fromDir = fs.getDir(getProject());
|
||||
|
||||
final String[] srcFiles = ds.getIncludedFiles();
|
||||
final String[] srcDirs = ds.getIncludedDirectories();
|
||||
|
||||
for (String src : srcFiles) {
|
||||
final File f = new File(fromDir, src);
|
||||
processingSingleFile(f);
|
||||
}
|
||||
|
||||
for (String src : srcDirs) {
|
||||
final File dir = new File(fromDir, src);
|
||||
processingSingleDirectory(dir);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void processingSingleFile(final File f) throws IOException, InterruptedException {
|
||||
this.log("Processing " + f.getAbsolutePath());
|
||||
final SourceFileReader sourceFileReader = new SourceFileReader(new Defines(), f, option.getOutputDir(), option
|
||||
.getConfig(), option.getCharset(), option.getFileFormatOption());
|
||||
final Collection<GeneratedImage> result = sourceFileReader.getGeneratedImages();
|
||||
for (GeneratedImage g : result) {
|
||||
this.log(g + " " + g.getDescription());
|
||||
}
|
||||
}
|
||||
|
||||
private void processingSingleDirectory(File f) throws IOException, InterruptedException {
|
||||
if (f.exists() == false) {
|
||||
final String s = "The file " + f.getAbsolutePath() + " does not exists.";
|
||||
this.log(s);
|
||||
throw new BuildException(s);
|
||||
}
|
||||
final DirWatcher dirWatcher = new DirWatcher(f, option, Option.getPattern());
|
||||
final Collection<GeneratedImage> result = dirWatcher.buildCreatedFiles();
|
||||
for (GeneratedImage g : result) {
|
||||
this.log(g + " " + g.getDescription());
|
||||
}
|
||||
}
|
||||
|
||||
public void setDir(String s) {
|
||||
this.dir = s;
|
||||
}
|
||||
|
||||
public void setOutput(String s) {
|
||||
option.setOutputDir(new File(s));
|
||||
}
|
||||
|
||||
public void setCharset(String s) {
|
||||
option.setCharset(s);
|
||||
}
|
||||
|
||||
public void setConfig(String s) {
|
||||
try {
|
||||
option.initConfig(s);
|
||||
} catch (IOException e) {
|
||||
log("Error reading " + s);
|
||||
}
|
||||
}
|
||||
|
||||
public void setKeepTmpFiles(String s) {
|
||||
if ("true".equalsIgnoreCase(s)) {
|
||||
OptionFlags.getInstance().setKeepTmpFiles(true);
|
||||
}
|
||||
}
|
||||
|
||||
public void setVerbose(String s) {
|
||||
if ("true".equalsIgnoreCase(s)) {
|
||||
OptionFlags.getInstance().setVerbose(true);
|
||||
}
|
||||
}
|
||||
|
||||
public void setFormat(String s) {
|
||||
if ("xmi".equalsIgnoreCase(s)) {
|
||||
option.setFileFormat(FileFormat.XMI_STANDARD);
|
||||
}
|
||||
if ("xmi:argo".equalsIgnoreCase(s)) {
|
||||
option.setFileFormat(FileFormat.XMI_ARGO);
|
||||
}
|
||||
if ("xmi:start".equalsIgnoreCase(s)) {
|
||||
option.setFileFormat(FileFormat.XMI_STAR);
|
||||
}
|
||||
if ("eps".equalsIgnoreCase(s)) {
|
||||
option.setFileFormat(FileFormat.EPS);
|
||||
}
|
||||
if ("svg".equalsIgnoreCase(s)) {
|
||||
option.setFileFormat(FileFormat.SVG);
|
||||
}
|
||||
if ("txt".equalsIgnoreCase(s)) {
|
||||
option.setFileFormat(FileFormat.ATXT);
|
||||
}
|
||||
if ("utxt".equalsIgnoreCase(s)) {
|
||||
option.setFileFormat(FileFormat.UTXT);
|
||||
}
|
||||
}
|
||||
|
||||
public void setGraphvizDot(String s) {
|
||||
OptionFlags.getInstance().setDotExecutable(s);
|
||||
}
|
||||
|
||||
public void setForcegd(String s) {
|
||||
if ("true".equalsIgnoreCase(s)) {
|
||||
OptionFlags.getInstance().setForceGd(true);
|
||||
}
|
||||
}
|
||||
|
||||
public void setForcecairo(String s) {
|
||||
if ("true".equalsIgnoreCase(s)) {
|
||||
OptionFlags.getInstance().setForceCairo(true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -33,15 +33,15 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.asciiart;
|
||||
|
||||
import java.awt.Font;
|
||||
import java.awt.geom.Dimension2D;
|
||||
|
||||
import net.sourceforge.plantuml.Dimension2DDouble;
|
||||
import net.sourceforge.plantuml.graphic.StringBounder;
|
||||
import net.sourceforge.plantuml.ugraphic.UFont;
|
||||
|
||||
public class TextStringBounder implements StringBounder {
|
||||
|
||||
public Dimension2D calculateDimension(Font font, String text) {
|
||||
public Dimension2D calculateDimension(UFont font, String text) {
|
||||
return new Dimension2DDouble(text.length(), 1);
|
||||
}
|
||||
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 6451 $
|
||||
* Revision $Revision: 6918 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.classdiagram;
|
||||
@ -36,6 +36,7 @@ package net.sourceforge.plantuml.classdiagram;
|
||||
import net.sourceforge.plantuml.classdiagram.command.CommandAddMethod;
|
||||
import net.sourceforge.plantuml.classdiagram.command.CommandCreateEntityClass2;
|
||||
import net.sourceforge.plantuml.classdiagram.command.CommandCreateEntityClassMultilines2;
|
||||
import net.sourceforge.plantuml.classdiagram.command.CommandDiamondAssociation;
|
||||
import net.sourceforge.plantuml.classdiagram.command.CommandEndNamespace;
|
||||
import net.sourceforge.plantuml.classdiagram.command.CommandHideShow;
|
||||
import net.sourceforge.plantuml.classdiagram.command.CommandHideShow3;
|
||||
@ -94,6 +95,8 @@ public class ClassDiagramFactory extends AbstractUmlSystemCommandFactory {
|
||||
// addCommand(new CommandCreateEntityClassMultilines(system));
|
||||
addCommand(new CommandCreateEntityClassMultilines2(system));
|
||||
|
||||
addCommand(new CommandDiamondAssociation(system));
|
||||
|
||||
addCommand(new CommandHideShow3(system));
|
||||
addCommand(new CommandHideShow(system));
|
||||
|
||||
|
@ -28,35 +28,32 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 4826 $
|
||||
* Revision $Revision: 5618 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.eps;
|
||||
package net.sourceforge.plantuml.classdiagram.command;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.List;
|
||||
|
||||
class InkscapeWindows extends AbstractInkscape {
|
||||
import net.sourceforge.plantuml.classdiagram.ClassDiagram;
|
||||
import net.sourceforge.plantuml.command.CommandExecutionResult;
|
||||
import net.sourceforge.plantuml.command.SingleLineCommand;
|
||||
import net.sourceforge.plantuml.cucadiagram.EntityType;
|
||||
|
||||
@Override
|
||||
protected File specificExe() {
|
||||
final File f1 = new File("C:\\Program Files\\Inkscape\\inkscape.exe");
|
||||
if (f1.exists()) {
|
||||
return f1;
|
||||
}
|
||||
public class CommandDiamondAssociation extends SingleLineCommand<ClassDiagram> {
|
||||
|
||||
final File f2 = new File("C:\\Program Files (x86)\\Inkscape\\inkscape.exe");
|
||||
if (f2.exists()) {
|
||||
return f2;
|
||||
}
|
||||
|
||||
return null;
|
||||
public CommandDiamondAssociation(ClassDiagram diagram) {
|
||||
super(diagram, "(?i)^\\<\\>\\s*([\\p{L}0-9_.]+)$");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void appendFilePath(final StringBuilder sb, File file) {
|
||||
sb.append('\"');
|
||||
sb.append(file.getAbsolutePath());
|
||||
sb.append('\"');
|
||||
protected CommandExecutionResult executeArg(List<String> arg) {
|
||||
final String code = arg.get(0);
|
||||
if (getSystem().entityExist(code)) {
|
||||
return CommandExecutionResult.error("Already existing : "+code);
|
||||
}
|
||||
getSystem().createEntity(code, null, EntityType.ASSOCIATION);
|
||||
|
||||
return CommandExecutionResult.ok();
|
||||
}
|
||||
}
|
@ -74,9 +74,9 @@ final public class CommandLinkClass2 extends SingleLineCommand2<AbstractClassOrO
|
||||
new RegexLeaf("\\s*"),
|
||||
new RegexOr(
|
||||
new RegexLeaf("LEFT_TO_RIGHT",
|
||||
"(([-=.]+)(?:(left|right|up|down|le?|ri?|up?|do?)(?=[-=.]))?([-=.]*)(o +|[\\]>*+]|\\|[>\\]])?)"),
|
||||
"(([-=.]+)(?:(left|right|up|down|le?|ri?|up?|do?)(?=[-=.]))?([-=.]*)(o +|[\\]>*+^]|\\|[>\\]])?)"),
|
||||
new RegexLeaf("RIGHT_TO_LEFT",
|
||||
"(( +o|[\\[<*+]|[<\\[]\\|)?([-=.]*)(left|right|up|down|le?|ri?|up?|do?)?([-=.]+))"),
|
||||
"(( +o|[\\[<*+^]|[<\\[]\\|)?([-=.]*)(left|right|up|down|le?|ri?|up?|do?)?([-=.]+))"),
|
||||
new RegexLeaf("NAV_AGREG_OR_COMPO_INV",
|
||||
"(\\<([-=.]*)(left|right|up|down|le?|ri?|up?|do?[-=.]+)?([-=.]+)(o +|\\*))"),
|
||||
new RegexLeaf("NAV_AGREG_OR_COMPO",
|
||||
@ -428,6 +428,9 @@ final public class CommandLinkClass2 extends SingleLineCommand2<AbstractClassOrO
|
||||
if (k.equals("<|") || k.equals("|>")) {
|
||||
return new LinkType(LinkDecor.EXTENDS, LinkDecor.NONE);
|
||||
}
|
||||
if (k.equals("^")) {
|
||||
return new LinkType(LinkDecor.EXTENDS, LinkDecor.NONE);
|
||||
}
|
||||
// return null;
|
||||
throw new IllegalArgumentException(k);
|
||||
}
|
||||
|
@ -1,242 +0,0 @@
|
||||
/* ========================================================================
|
||||
* 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: 5075 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.classdiagram.command;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import net.sourceforge.plantuml.UniqueSequence;
|
||||
import net.sourceforge.plantuml.command.CommandExecutionResult;
|
||||
import net.sourceforge.plantuml.command.SingleLineCommand;
|
||||
import net.sourceforge.plantuml.cucadiagram.Entity;
|
||||
import net.sourceforge.plantuml.cucadiagram.EntityType;
|
||||
import net.sourceforge.plantuml.cucadiagram.Group;
|
||||
import net.sourceforge.plantuml.cucadiagram.IEntity;
|
||||
import net.sourceforge.plantuml.cucadiagram.Link;
|
||||
import net.sourceforge.plantuml.cucadiagram.LinkDecor;
|
||||
import net.sourceforge.plantuml.cucadiagram.LinkType;
|
||||
import net.sourceforge.plantuml.objectdiagram.AbstractClassOrObjectDiagram;
|
||||
|
||||
final public class CommandLinkLollipop extends SingleLineCommand<AbstractClassOrObjectDiagram> {
|
||||
|
||||
private static final int OFFSET = 1;
|
||||
|
||||
private static final int FIRST_TYPE_AND_CLASS = 0 + OFFSET;
|
||||
private static final int FIRST_TYPE = 1 + OFFSET;
|
||||
private static final int FIRST_CLASS = 2 + OFFSET;
|
||||
private static final int FIRST_LABEL = 3 + OFFSET;
|
||||
|
||||
private static final int LINK1 = 4 + OFFSET;
|
||||
private static final int LINK2 = 5 + OFFSET;
|
||||
|
||||
private static final int SECOND_LABEL = 6 + OFFSET;
|
||||
private static final int SECOND_TYPE_AND_CLASS = 7 + OFFSET;
|
||||
private static final int SECOND_TYPE = 8 + OFFSET;
|
||||
private static final int SECOND_CLASS = 9 + OFFSET;
|
||||
private static final int LINK_LABEL = 10 + OFFSET;
|
||||
|
||||
private final Pattern patternAssociationPoint = Pattern
|
||||
.compile("\\(\\s*(\\.?[\\p{L}0-9_]+(?:\\.[\\p{L}0-9_]+)*)\\s*,\\s*(\\.?[\\p{L}0-9_]+(?:\\.[\\p{L}0-9_]+)*)\\s*\\)");
|
||||
|
||||
private CommandLinkLollipop(AbstractClassOrObjectDiagram diagram) {
|
||||
super(
|
||||
diagram,
|
||||
"(?i)^(?:@([\\d.])\\s+)?((?:(interface|enum|abstract\\s+class|abstract|class)\\s+)?(\\.?[\\p{L}0-9_]+(?:\\.[\\p{L}0-9_]+)*)|\\(\\s*\\.?[\\p{L}0-9_]+(?:\\.[\\p{L}0-9_]+)*\\s*,\\s*\\.?[\\p{L}0-9_]+(?:\\.[\\p{L}0-9_]+)*\\s*\\))\\s*(?:\"([^\"]+)\")?\\s*"
|
||||
// +
|
||||
// "(?:(([-=.]+)([\\]>o*+]|\\|[>\\]])?)|(([\\[<o*+]|[<\\[]\\|)?([-=.]+))|(\\<([-=.]+)([o*]))|(([o*])([-=.]+)\\>))"
|
||||
+ "(?:\\(\\)([-=.]+)|([-=.]+)\\(\\))"
|
||||
+ "\\s*(?:\"([^\"]+)\")?\\s*((?:(interface|enum|abstract\\s+class|abstract|class)\\s+)?(\\.?[\\p{L}0-9_]+(?:\\.[\\p{L}0-9_]+)*)|\\(\\s*\\.?[\\p{L}0-9_]+(?:\\.[\\p{L}0-9_]+)*\\s*,\\s*\\.?[\\p{L}0-9_]+(?:\\.[\\p{L}0-9_]+)*\\s*\\))\\s*(?::\\s*([^\"]+))?$");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected CommandExecutionResult executeArg(List<String> arg) {
|
||||
if (arg.get(FIRST_TYPE_AND_CLASS).startsWith("(")) {
|
||||
return executeArgSpecial1(arg);
|
||||
}
|
||||
if (arg.get(SECOND_TYPE_AND_CLASS).startsWith("(")) {
|
||||
return executeArgSpecial2(arg);
|
||||
}
|
||||
if (getSystem().isGroup(arg.get(FIRST_CLASS)) && getSystem().isGroup(arg.get(SECOND_CLASS))) {
|
||||
return executePackageLink(arg);
|
||||
}
|
||||
if (getSystem().isGroup(arg.get(FIRST_CLASS)) || getSystem().isGroup(arg.get(SECOND_CLASS))) {
|
||||
return CommandExecutionResult.error("Package can be only linked to other package");
|
||||
}
|
||||
|
||||
final Entity cl1;
|
||||
final Entity cl2;
|
||||
final Entity normalEntity;
|
||||
|
||||
final String suffix = "lol" + UniqueSequence.getValue();
|
||||
if (arg.get(LINK1) != null) {
|
||||
cl2 = (Entity) getSystem().getOrCreateClass(arg.get(SECOND_CLASS));
|
||||
cl1 = getSystem().createEntity(cl2.getCode() + suffix, arg.get(FIRST_CLASS), EntityType.LOLLIPOP);
|
||||
normalEntity = cl2;
|
||||
} else {
|
||||
assert arg.get(LINK2) != null;
|
||||
cl1 = (Entity) getSystem().getOrCreateClass(arg.get(FIRST_CLASS));
|
||||
cl2 = getSystem().createEntity(cl1.getCode() + suffix, arg.get(SECOND_CLASS), EntityType.LOLLIPOP);
|
||||
normalEntity = cl1;
|
||||
}
|
||||
|
||||
final LinkType linkType = getLinkType(arg);
|
||||
final String queue = getQueue(arg);
|
||||
|
||||
int length = queue.length();
|
||||
if (length == 1 && getSystem().getNbOfHozizontalLollipop(normalEntity) > 1) {
|
||||
length++;
|
||||
}
|
||||
final Link link = new Link(cl1, cl2, linkType, arg.get(LINK_LABEL), length, arg.get(FIRST_LABEL), arg
|
||||
.get(SECOND_LABEL), getSystem().getLabeldistance(), getSystem().getLabelangle());
|
||||
getSystem().resetPragmaLabel();
|
||||
addLink(link, arg.get(0));
|
||||
|
||||
return CommandExecutionResult.ok();
|
||||
}
|
||||
|
||||
private String getQueue(List<String> arg) {
|
||||
if (arg.get(LINK1) != null) {
|
||||
return arg.get(LINK1);
|
||||
}
|
||||
if (arg.get(LINK2) != null) {
|
||||
return arg.get(LINK2);
|
||||
}
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
|
||||
private LinkType getLinkType(List<String> arg) {
|
||||
return new LinkType(LinkDecor.NONE, LinkDecor.NONE);
|
||||
}
|
||||
|
||||
private void addLink(Link link, String arg0) {
|
||||
getSystem().addLink(link);
|
||||
if (arg0 == null) {
|
||||
final LinkType type = link.getType();
|
||||
// --|> highest
|
||||
// --*, -->, --o normal
|
||||
// ..*, ..>, ..o lowest
|
||||
// if (type.isDashed() == false) {
|
||||
// if (type.contains(LinkDecor.EXTENDS)) {
|
||||
// link.setWeight(3);
|
||||
// }
|
||||
// if (type.contains(LinkDecor.ARROW) ||
|
||||
// type.contains(LinkDecor.COMPOSITION)
|
||||
// || type.contains(LinkDecor.AGREGATION)) {
|
||||
// link.setWeight(2);
|
||||
// }
|
||||
// }
|
||||
} else {
|
||||
link.setWeight(Double.parseDouble(arg0));
|
||||
}
|
||||
}
|
||||
|
||||
private CommandExecutionResult executePackageLink(List<String> arg) {
|
||||
final Group cl1 = getSystem().getGroup(arg.get(FIRST_CLASS));
|
||||
final Group cl2 = getSystem().getGroup(arg.get(SECOND_CLASS));
|
||||
|
||||
final LinkType linkType = getLinkType(arg);
|
||||
final String queue = getQueue(arg);
|
||||
|
||||
final Link link = new Link(cl1.getEntityCluster(), cl2.getEntityCluster(), linkType, arg.get(LINK_LABEL), queue
|
||||
.length(), arg.get(FIRST_LABEL), arg.get(SECOND_LABEL), getSystem().getLabeldistance(), getSystem()
|
||||
.getLabelangle());
|
||||
getSystem().resetPragmaLabel();
|
||||
addLink(link, arg.get(0));
|
||||
return CommandExecutionResult.ok();
|
||||
}
|
||||
|
||||
private CommandExecutionResult executeArgSpecial1(List<String> arg) {
|
||||
final Matcher m = patternAssociationPoint.matcher(arg.get(FIRST_TYPE_AND_CLASS));
|
||||
if (m.matches() == false) {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
final String clName1 = m.group(1);
|
||||
final String clName2 = m.group(2);
|
||||
if (getSystem().entityExist(clName1) == false) {
|
||||
return CommandExecutionResult.error("No class " + clName1);
|
||||
}
|
||||
if (getSystem().entityExist(clName2) == false) {
|
||||
return CommandExecutionResult.error("No class " + clName2);
|
||||
}
|
||||
final IEntity entity1 = getSystem().getOrCreateClass(clName1);
|
||||
final IEntity entity2 = getSystem().getOrCreateClass(clName2);
|
||||
|
||||
final Entity node = getSystem().createEntity(arg.get(FIRST_TYPE_AND_CLASS), "node",
|
||||
EntityType.POINT_FOR_ASSOCIATION);
|
||||
|
||||
getSystem().insertBetween(entity1, entity2, node);
|
||||
final IEntity cl2 = getSystem().getOrCreateClass(arg.get(SECOND_CLASS));
|
||||
|
||||
final LinkType linkType = getLinkType(arg);
|
||||
final String queue = getQueue(arg);
|
||||
|
||||
final Link link = new Link(node, cl2, linkType, arg.get(LINK_LABEL), queue.length());
|
||||
addLink(link, arg.get(0));
|
||||
|
||||
return CommandExecutionResult.ok();
|
||||
}
|
||||
|
||||
private CommandExecutionResult executeArgSpecial2(List<String> arg) {
|
||||
final Matcher m = patternAssociationPoint.matcher(arg.get(SECOND_TYPE_AND_CLASS));
|
||||
if (m.matches() == false) {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
final String clName1 = m.group(1);
|
||||
final String clName2 = m.group(2);
|
||||
if (getSystem().entityExist(clName1) == false) {
|
||||
return CommandExecutionResult.error("No class " + clName1);
|
||||
}
|
||||
if (getSystem().entityExist(clName2) == false) {
|
||||
return CommandExecutionResult.error("No class " + clName2);
|
||||
}
|
||||
final IEntity entity1 = getSystem().getOrCreateClass(clName1);
|
||||
final IEntity entity2 = getSystem().getOrCreateClass(clName2);
|
||||
|
||||
final IEntity node = getSystem().createEntity(arg.get(SECOND_TYPE_AND_CLASS), "node",
|
||||
EntityType.POINT_FOR_ASSOCIATION);
|
||||
|
||||
getSystem().insertBetween(entity1, entity2, node);
|
||||
final IEntity cl1 = getSystem().getOrCreateClass(arg.get(FIRST_TYPE_AND_CLASS));
|
||||
|
||||
final LinkType linkType = getLinkType(arg);
|
||||
final String queue = getQueue(arg);
|
||||
|
||||
final Link link = new Link(cl1, node, linkType, arg.get(LINK_LABEL), queue.length());
|
||||
addLink(link, arg.get(0));
|
||||
|
||||
return CommandExecutionResult.ok();
|
||||
}
|
||||
|
||||
}
|
@ -96,7 +96,7 @@ public class CompressionZlib implements Compression {
|
||||
final byte[] result = copyArray(tmp, resultLength);
|
||||
return result;
|
||||
} catch (DataFormatException e) {
|
||||
e.printStackTrace();
|
||||
// e.printStackTrace();
|
||||
throw new IOException(e.toString());
|
||||
}
|
||||
}
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 6486 $
|
||||
* Revision $Revision: 6575 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.command;
|
||||
@ -45,6 +45,7 @@ import net.sourceforge.plantuml.cucadiagram.IEntity;
|
||||
import net.sourceforge.plantuml.cucadiagram.Link;
|
||||
import net.sourceforge.plantuml.cucadiagram.LinkDecor;
|
||||
import net.sourceforge.plantuml.cucadiagram.LinkType;
|
||||
import net.sourceforge.plantuml.graphic.HtmlColor;
|
||||
import net.sourceforge.plantuml.sequencediagram.Note;
|
||||
|
||||
public abstract class AbstractCommandMultilinesNoteEntity extends CommandMultilines<AbstractEntityDiagram> {
|
||||
@ -72,7 +73,7 @@ public abstract class AbstractCommandMultilinesNoteEntity extends CommandMultili
|
||||
final String s = StringUtils.getMergedLines(strings);
|
||||
|
||||
final Entity note = getSystem().createEntity("GMN" + UniqueSequence.getValue(), s, EntityType.NOTE);
|
||||
note.setSpecificBackcolor(line0.get(2));
|
||||
note.setSpecificBackcolor(HtmlColor.getColorIfValid(line0.get(2)));
|
||||
note.setUrl(url);
|
||||
|
||||
final Position position = Position.valueOf(pos.toUpperCase()).withRankdir(getSystem().getRankdir());
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 6423 $
|
||||
* Revision $Revision: 6750 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.command;
|
||||
@ -44,6 +44,7 @@ import net.sourceforge.plantuml.UmlDiagram;
|
||||
public abstract class AbstractUmlSystemCommandFactory implements PSystemCommandFactory {
|
||||
|
||||
private final DiagramType type;
|
||||
private List<Command> cmds;
|
||||
|
||||
protected AbstractUmlSystemCommandFactory() {
|
||||
this(DiagramType.UML);
|
||||
@ -51,14 +52,12 @@ public abstract class AbstractUmlSystemCommandFactory implements PSystemCommandF
|
||||
|
||||
protected AbstractUmlSystemCommandFactory(DiagramType type) {
|
||||
this.type = type;
|
||||
reset();
|
||||
}
|
||||
|
||||
public String checkFinalError() {
|
||||
return null;
|
||||
}
|
||||
|
||||
private List<Command> cmds = new ArrayList<Command>();
|
||||
|
||||
final public CommandControl isValid(List<String> lines) {
|
||||
for (Command cmd : cmds) {
|
||||
@ -83,7 +82,7 @@ public abstract class AbstractUmlSystemCommandFactory implements PSystemCommandF
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
|
||||
final public void reset() {
|
||||
final public void init(String startLine) {
|
||||
cmds = new ArrayList<Command>();
|
||||
initCommands();
|
||||
}
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 4762 $
|
||||
* Revision $Revision: 6575 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.command;
|
||||
@ -38,6 +38,7 @@ import java.util.List;
|
||||
import net.sourceforge.plantuml.classdiagram.AbstractEntityDiagram;
|
||||
import net.sourceforge.plantuml.cucadiagram.Entity;
|
||||
import net.sourceforge.plantuml.cucadiagram.EntityType;
|
||||
import net.sourceforge.plantuml.graphic.HtmlColor;
|
||||
|
||||
public class CommandCreateNote extends SingleLineCommand<AbstractEntityDiagram> {
|
||||
|
||||
@ -51,7 +52,7 @@ public class CommandCreateNote extends SingleLineCommand<AbstractEntityDiagram>
|
||||
final String code = arg.get(1);
|
||||
final Entity entity = getSystem().createEntity(code, display, EntityType.NOTE);
|
||||
assert entity != null;
|
||||
entity.setSpecificBackcolor(arg.get(2));
|
||||
entity.setSpecificBackcolor(HtmlColor.getColorIfValid(arg.get(2)));
|
||||
return CommandExecutionResult.ok();
|
||||
}
|
||||
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 5751 $
|
||||
* Revision $Revision: 6575 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.command;
|
||||
@ -38,6 +38,7 @@ import java.util.List;
|
||||
import net.sourceforge.plantuml.StringUtils;
|
||||
import net.sourceforge.plantuml.classdiagram.AbstractEntityDiagram;
|
||||
import net.sourceforge.plantuml.cucadiagram.EntityType;
|
||||
import net.sourceforge.plantuml.graphic.HtmlColor;
|
||||
|
||||
public class CommandMultilinesStandaloneNote extends CommandMultilines<AbstractEntityDiagram> {
|
||||
|
||||
@ -54,7 +55,7 @@ public class CommandMultilinesStandaloneNote extends CommandMultilines<AbstractE
|
||||
|
||||
final EntityType type = EntityType.NOTE;
|
||||
final String code = line0.get(1);
|
||||
getSystem().createEntity(code, display, type).setSpecificBackcolor(line0.get(2));
|
||||
getSystem().createEntity(code, display, type).setSpecificBackcolor(HtmlColor.getColorIfValid(line0.get(2)));
|
||||
|
||||
return CommandExecutionResult.ok();
|
||||
}
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 5752 $
|
||||
* Revision $Revision: 6922 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.command;
|
||||
@ -47,7 +47,7 @@ public class CommandMultilinesTitle extends CommandMultilines<UmlDiagram> {
|
||||
public CommandExecutionResult execute(List<String> lines) {
|
||||
final List<String> strings = StringUtils.removeEmptyColumns(lines.subList(1, lines.size() - 1));
|
||||
if (strings.size() > 0) {
|
||||
getSystem().setTitle(strings);
|
||||
getSystem().setTitle(StringUtils.manageEmbededDiagrams(strings));
|
||||
return CommandExecutionResult.ok();
|
||||
}
|
||||
return CommandExecutionResult.error("No title defined");
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 5616 $
|
||||
* Revision $Revision: 6575 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.command;
|
||||
@ -43,6 +43,7 @@ import net.sourceforge.plantuml.cucadiagram.IEntity;
|
||||
import net.sourceforge.plantuml.cucadiagram.Link;
|
||||
import net.sourceforge.plantuml.cucadiagram.LinkDecor;
|
||||
import net.sourceforge.plantuml.cucadiagram.LinkType;
|
||||
import net.sourceforge.plantuml.graphic.HtmlColor;
|
||||
|
||||
final public class CommandNoteEntity extends SingleLineCommand<AbstractEntityDiagram> {
|
||||
|
||||
@ -58,7 +59,7 @@ final public class CommandNoteEntity extends SingleLineCommand<AbstractEntityDia
|
||||
final String pos = arg.get(0);
|
||||
final IEntity cl1 = getSystem().getOrCreateClass(arg.get(1));
|
||||
final Entity note = getSystem().createEntity("GN" + UniqueSequence.getValue(), arg.get(3), EntityType.NOTE);
|
||||
note.setSpecificBackcolor(arg.get(2));
|
||||
note.setSpecificBackcolor(HtmlColor.getColorIfValid(arg.get(2)));
|
||||
|
||||
final Link link;
|
||||
final Position position = Position.valueOf(pos.toUpperCase()).withRankdir(getSystem().getRankdir());
|
||||
|
@ -72,7 +72,7 @@ public class CommandCreateActorInComponent extends SingleLineCommand<ComponentDi
|
||||
}
|
||||
final String stereotype = arg.get(2);
|
||||
final Entity entity = (Entity) getSystem().getOrCreateEntity(code, type);
|
||||
entity.setDisplay(display);
|
||||
entity.setDisplay2(display);
|
||||
|
||||
if (stereotype != null) {
|
||||
entity.setStereotype(new Stereotype(stereotype, getSystem().getSkinParam().getCircledCharacterRadius(),
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 5728 $
|
||||
* Revision $Revision: 6923 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.componentdiagram.command;
|
||||
@ -75,7 +75,7 @@ public class CommandCreateCircleInterface extends SingleLineCommand<ComponentDia
|
||||
final String stereotype = arg.get(2);
|
||||
// final Entity entity = getSystem().createEntity(code, display, type);
|
||||
final Entity entity = (Entity) getSystem().getOrCreateEntity(code, type);
|
||||
entity.setDisplay(display);
|
||||
entity.setDisplay2(display);
|
||||
if (stereotype != null) {
|
||||
entity.setStereotype(new Stereotype(stereotype, getSystem().getSkinParam().getCircledCharacterRadius(),
|
||||
getSystem().getSkinParam().getFont(FontParam.CIRCLED_CHARACTER, null)));
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 5728 $
|
||||
* Revision $Revision: 6923 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.componentdiagram.command;
|
||||
@ -75,7 +75,7 @@ public class CommandCreateComponent extends SingleLineCommand<ComponentDiagram>
|
||||
final String stereotype = arg.get(2);
|
||||
// final Entity entity = getSystem().createEntity(code, display, type);
|
||||
final Entity entity = (Entity) getSystem().getOrCreateEntity(code, type);
|
||||
entity.setDisplay(display);
|
||||
entity.setDisplay2(display);
|
||||
if (stereotype != null) {
|
||||
entity.setStereotype(new Stereotype(stereotype, getSystem().getSkinParam().getCircledCharacterRadius(),
|
||||
getSystem().getSkinParam().getFont(FontParam.CIRCLED_CHARACTER, null)));
|
||||
|
@ -64,10 +64,9 @@ public class CommandLinkComponent2 extends SingleLineCommand2<ComponentDiagram>
|
||||
new RegexOr(
|
||||
//
|
||||
new RegexLeaf("AR_TO_RIGHT",
|
||||
"(([-=.]+)(?:(left|right|up|down|le?|ri?|up?|do?)(?=[-=.]))?([-=.]*)([\\]>]|\\|[>\\]])?)"),
|
||||
// "(([-=.]+)(left|right|up|down|le?|ri?|up?|do?)?([-=.]*?\\.*)([\\]>]|\\|[>\\]])?)"),
|
||||
"(([-=.]+)(?:(left|right|up|down|le?|ri?|up?|do?)(?=[-=.]))?([-=.]*)([\\]>^]|\\|[>\\]])?)"),
|
||||
new RegexLeaf("AR_TO_LEFT",
|
||||
"(([\\[<]|[<\\[]\\|)?([-=.]*)(left|right|up|down|le?|ri?|up?|do?)?([-=.]+))")),
|
||||
"(([\\[<^]|[<\\[]\\|)?([-=.]*)(left|right|up|down|le?|ri?|up?|do?)?([-=.]+))")),
|
||||
new RegexLeaf("\\s*"),//
|
||||
getRegexGroup("G2"),//
|
||||
new RegexLeaf("\\s*"),//
|
||||
@ -179,6 +178,9 @@ public class CommandLinkComponent2 extends SingleLineCommand2<ComponentDiagram>
|
||||
if (k.equals("<|") || k.equals("|>")) {
|
||||
return new LinkType(LinkDecor.EXTENDS, LinkDecor.NONE);
|
||||
}
|
||||
if (k.equals("^")) {
|
||||
return new LinkType(LinkDecor.EXTENDS, LinkDecor.NONE);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@ -54,7 +54,7 @@ public class CommandCreateBlock extends SingleLineCommand<CompositeDiagram> {
|
||||
display = code;
|
||||
}
|
||||
final Entity ent = (Entity) getSystem().getOrCreateClass(code);
|
||||
ent.setDisplay(display);
|
||||
ent.setDisplay2(display);
|
||||
return CommandExecutionResult.ok();
|
||||
}
|
||||
|
||||
|
@ -28,16 +28,18 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 6453 $
|
||||
* Revision $Revision: 6892 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.cucadiagram;
|
||||
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.io.PrintStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
@ -55,14 +57,19 @@ import java.util.TreeMap;
|
||||
import net.sourceforge.plantuml.FileFormat;
|
||||
import net.sourceforge.plantuml.FileFormatOption;
|
||||
import net.sourceforge.plantuml.Log;
|
||||
import net.sourceforge.plantuml.OptionFlags;
|
||||
import net.sourceforge.plantuml.UmlDiagram;
|
||||
import net.sourceforge.plantuml.UmlDiagramType;
|
||||
import net.sourceforge.plantuml.cucadiagram.dot.CucaDiagramFileMaker;
|
||||
import net.sourceforge.plantuml.cucadiagram.dot.CucaDiagramFileMakerBeta;
|
||||
import net.sourceforge.plantuml.cucadiagram.dot.CucaDiagramPngMaker3;
|
||||
import net.sourceforge.plantuml.cucadiagram.dot.CucaDiagramTxtMaker;
|
||||
import net.sourceforge.plantuml.cucadiagram.dot.DrawFile;
|
||||
import net.sourceforge.plantuml.cucadiagram.dot.ICucaDiagramFileMaker;
|
||||
import net.sourceforge.plantuml.png.PngSplitter;
|
||||
import net.sourceforge.plantuml.skin.VisibilityModifier;
|
||||
import net.sourceforge.plantuml.svek.CucaDiagramFileMakerSvek;
|
||||
import net.sourceforge.plantuml.ugraphic.ColorMapper;
|
||||
import net.sourceforge.plantuml.xmi.CucaDiagramXmiMaker;
|
||||
|
||||
public abstract class CucaDiagram extends UmlDiagram implements GroupHierarchy, PortionShower {
|
||||
@ -70,7 +77,9 @@ public abstract class CucaDiagram extends UmlDiagram implements GroupHierarchy,
|
||||
private int horizontalPages = 1;
|
||||
private int verticalPages = 1;
|
||||
|
||||
private final Map<String, Entity> entities = new TreeMap<String, Entity>();
|
||||
private final Map<String, Entity> entities = new LinkedHashMap<String, Entity>();
|
||||
// private final Map<String, Entity> entities = new TreeMap<String,
|
||||
// Entity>();
|
||||
private final Map<IEntity, Integer> nbLinks = new HashMap<IEntity, Integer>();
|
||||
|
||||
private final List<Link> links = new ArrayList<Link>();
|
||||
@ -149,6 +158,9 @@ public abstract class CucaDiagram extends UmlDiagram implements GroupHierarchy,
|
||||
}
|
||||
}
|
||||
entities.put(proxy.getCode(), proxy);
|
||||
// if (proxy.getImageFile() != null) {
|
||||
// proxy.addSubImage(proxy.getImageFile());
|
||||
// }
|
||||
}
|
||||
|
||||
final public Collection<Group> getChildrenGroups(Group parent) {
|
||||
@ -220,8 +232,11 @@ public abstract class CucaDiagram extends UmlDiagram implements GroupHierarchy,
|
||||
}
|
||||
|
||||
final public Map<String, Entity> entities() {
|
||||
if (OptionFlags.SVEK) {
|
||||
return Collections.unmodifiableMap(entities);
|
||||
}
|
||||
return Collections.unmodifiableMap(new TreeMap<String, Entity>(entities));
|
||||
}
|
||||
|
||||
final public void addLink(Link link) {
|
||||
links.add(link);
|
||||
@ -275,6 +290,16 @@ public abstract class CucaDiagram extends UmlDiagram implements GroupHierarchy,
|
||||
|
||||
abstract protected List<String> getDotStrings();
|
||||
|
||||
final public String[] getDotStringSkek() {
|
||||
final List<String> result = new ArrayList<String>();
|
||||
for (String s : getDotStrings()) {
|
||||
if (s.startsWith("nodesep") || s.startsWith("ranksep")) {
|
||||
result.add(s);
|
||||
}
|
||||
}
|
||||
return result.toArray(new String[result.size()]);
|
||||
}
|
||||
|
||||
// final public List<File> createFiles(File suggestedFile, FileFormatOption
|
||||
// fileFormatOption) throws IOException,
|
||||
// InterruptedException {
|
||||
@ -325,7 +350,7 @@ public abstract class CucaDiagram extends UmlDiagram implements GroupHierarchy,
|
||||
final StringBuilder cmap = new StringBuilder();
|
||||
OutputStream os = null;
|
||||
try {
|
||||
os = new FileOutputStream(suggestedFile);
|
||||
os = new BufferedOutputStream(new FileOutputStream(suggestedFile));
|
||||
this.exportDiagram(os, cmap, 0, fileFormat);
|
||||
} finally {
|
||||
if (os != null) {
|
||||
@ -351,7 +376,11 @@ public abstract class CucaDiagram extends UmlDiagram implements GroupHierarchy,
|
||||
FileFormatOption fileFormatOption, List<BufferedImage> flashcodes) throws IOException {
|
||||
final FileFormat fileFormat = fileFormatOption.getFileFormat();
|
||||
if (fileFormat == FileFormat.ATXT || fileFormat == FileFormat.UTXT) {
|
||||
try {
|
||||
createFilesTxt(os, index, fileFormat);
|
||||
} catch (Throwable t) {
|
||||
t.printStackTrace(new PrintStream(os));
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@ -383,7 +412,12 @@ public abstract class CucaDiagram extends UmlDiagram implements GroupHierarchy,
|
||||
}
|
||||
return;
|
||||
}
|
||||
final CucaDiagramFileMaker maker = new CucaDiagramFileMaker(this, flashcodes);
|
||||
final ICucaDiagramFileMaker maker;
|
||||
if (OptionFlags.SVEK) {
|
||||
maker = new CucaDiagramFileMakerSvek(this, flashcodes);
|
||||
} else {
|
||||
maker = new CucaDiagramFileMaker(this, flashcodes);
|
||||
}
|
||||
try {
|
||||
final String cmapResult = maker.createFile(os, getDotStrings(), fileFormatOption);
|
||||
if (cmapResult != null && cmap != null) {
|
||||
@ -574,4 +608,45 @@ public abstract class CucaDiagram extends UmlDiagram implements GroupHierarchy,
|
||||
public final Set<VisibilityModifier> getHides() {
|
||||
return Collections.unmodifiableSet(hides);
|
||||
}
|
||||
|
||||
public void clean() throws IOException {
|
||||
for (Imaged entity : entities().values()) {
|
||||
cleanTemporaryFiles(entity);
|
||||
}
|
||||
for (Imaged entity : getLinks()) {
|
||||
cleanTemporaryFiles(entity);
|
||||
}
|
||||
for (Group g : groups.values()) {
|
||||
final IEntity entity = g.getEntityCluster();
|
||||
if (entity != null) {
|
||||
cleanTemporaryFiles(entity);
|
||||
}
|
||||
}
|
||||
for (DrawFile f : ensureDeletes) {
|
||||
f.deleteDrawFile();
|
||||
}
|
||||
}
|
||||
|
||||
private void cleanTemporaryFiles(Imaged entity) {
|
||||
if (entity.getImageFile() != null) {
|
||||
entity.getImageFile().deleteDrawFile();
|
||||
}
|
||||
if (entity instanceof Entity) {
|
||||
((Entity) entity).cleanSubImage();
|
||||
}
|
||||
}
|
||||
|
||||
private final Set<DrawFile> ensureDeletes = new HashSet<DrawFile>();
|
||||
|
||||
public void ensureDelete(DrawFile imageFile) {
|
||||
if (imageFile == null) {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
ensureDeletes.add(imageFile);
|
||||
}
|
||||
|
||||
public ColorMapper getColorMapper() {
|
||||
return getSkinParam().getColorMapper();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 6482 $
|
||||
* Revision $Revision: 6923 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.cucadiagram;
|
||||
@ -36,20 +36,24 @@ package net.sourceforge.plantuml.cucadiagram;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import net.sourceforge.plantuml.StringUtils;
|
||||
import net.sourceforge.plantuml.UniqueSequence;
|
||||
import net.sourceforge.plantuml.Url;
|
||||
import net.sourceforge.plantuml.cucadiagram.dot.DrawFile;
|
||||
import net.sourceforge.plantuml.graphic.HtmlColor;
|
||||
import net.sourceforge.plantuml.skin.VisibilityModifier;
|
||||
import net.sourceforge.plantuml.svek.IEntityImage;
|
||||
|
||||
public class Entity implements IEntity {
|
||||
|
||||
private final String code;
|
||||
private String display;
|
||||
private List<? extends CharSequence> display2;
|
||||
|
||||
private final String uid;
|
||||
private EntityType type;
|
||||
@ -76,10 +80,15 @@ public class Entity implements IEntity {
|
||||
}
|
||||
|
||||
public Entity(String code, String display, EntityType type, Group entityPackage, Set<VisibilityModifier> hides) {
|
||||
this("cl" + UniqueSequence.getValue(), code, display, type, entityPackage, hides);
|
||||
this("cl", UniqueSequence.getValue(), code, display, type, entityPackage, hides);
|
||||
}
|
||||
|
||||
public Entity(String uid, String code, String display, EntityType type, Group entityPackage,
|
||||
public Entity(String uid1, int uid2, String code, String display, EntityType type, Group entityPackage,
|
||||
Set<VisibilityModifier> hides) {
|
||||
this(uid1, uid2, code, StringUtils.getWithNewlines(display), type, entityPackage, hides);
|
||||
}
|
||||
|
||||
public Entity(String uid1, int uid2, String code, List<? extends CharSequence> display, EntityType type, Group entityPackage,
|
||||
Set<VisibilityModifier> hides) {
|
||||
if (code == null || code.length() == 0) {
|
||||
throw new IllegalArgumentException();
|
||||
@ -88,10 +97,10 @@ public class Entity implements IEntity {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
this.hides = hides;
|
||||
this.uid = uid;
|
||||
this.uid = StringUtils.getUid(uid1, uid2);
|
||||
this.type = type;
|
||||
this.code = code;
|
||||
this.display = display;
|
||||
this.display2 = display;
|
||||
this.container = entityPackage;
|
||||
if (entityPackage != null && type != EntityType.GROUP) {
|
||||
entityPackage.addEntity(this);
|
||||
@ -175,12 +184,16 @@ public class Entity implements IEntity {
|
||||
return code;
|
||||
}
|
||||
|
||||
public String getDisplay() {
|
||||
return display;
|
||||
public List<? extends CharSequence> getDisplay2() {
|
||||
return display2;
|
||||
}
|
||||
|
||||
public void setDisplay(String display) {
|
||||
this.display = display;
|
||||
public void setDisplay2(String display) {
|
||||
this.display2 = StringUtils.getWithNewlines(display);
|
||||
}
|
||||
|
||||
public void setDisplay2(List<? extends CharSequence> display) {
|
||||
this.display2 = display;
|
||||
}
|
||||
|
||||
public String getUid() {
|
||||
@ -202,9 +215,9 @@ public class Entity implements IEntity {
|
||||
@Override
|
||||
public String toString() {
|
||||
if (type == EntityType.GROUP) {
|
||||
return display + "(" + getType() + ")" + this.container;
|
||||
return display2 + "(" + getType() + ")" + this.container;
|
||||
}
|
||||
return display + "(" + getType() + ")";
|
||||
return display2 + "(" + getType() + ") " + xposition + " " + getUid();
|
||||
}
|
||||
|
||||
public void muteToCluster(Group newGroup) {
|
||||
@ -234,8 +247,8 @@ public class Entity implements IEntity {
|
||||
return specificBackcolor;
|
||||
}
|
||||
|
||||
public void setSpecificBackcolor(String s) {
|
||||
this.specificBackcolor = HtmlColor.getColorIfValid(s);
|
||||
public void setSpecificBackcolor(HtmlColor color) {
|
||||
this.specificBackcolor = color;
|
||||
}
|
||||
|
||||
public final Url getUrl() {
|
||||
@ -260,7 +273,7 @@ public class Entity implements IEntity {
|
||||
return uid.equals(other.getUid());
|
||||
}
|
||||
|
||||
private final List<DrawFile> subImages = new ArrayList<DrawFile>();
|
||||
private final Set<DrawFile> subImages = new HashSet<DrawFile>();
|
||||
|
||||
public void addSubImage(DrawFile subImage) {
|
||||
if (subImage == null) {
|
||||
@ -269,6 +282,10 @@ public class Entity implements IEntity {
|
||||
subImages.add(subImage);
|
||||
}
|
||||
|
||||
public void addSubImage(Entity other) {
|
||||
subImages.addAll(other.subImages);
|
||||
}
|
||||
|
||||
public DrawFile getImageFile(File searched) throws IOException {
|
||||
if (imageFile != null && imageFile.getPng().getCanonicalFile().equals(searched)) {
|
||||
return imageFile;
|
||||
@ -281,6 +298,12 @@ public class Entity implements IEntity {
|
||||
return null;
|
||||
}
|
||||
|
||||
public void cleanSubImage() {
|
||||
for (DrawFile f : subImages) {
|
||||
f.deleteDrawFile();
|
||||
}
|
||||
}
|
||||
|
||||
private boolean nearDecoration = false;
|
||||
|
||||
public final boolean hasNearDecoration() {
|
||||
@ -291,4 +314,28 @@ public class Entity implements IEntity {
|
||||
this.nearDecoration = nearDecoration;
|
||||
}
|
||||
|
||||
public int compareTo(IEntity other) {
|
||||
return getUid().compareTo(other.getUid());
|
||||
}
|
||||
|
||||
private int xposition;
|
||||
|
||||
public int getXposition() {
|
||||
return xposition;
|
||||
}
|
||||
|
||||
public void setXposition(int pos) {
|
||||
xposition = pos;
|
||||
}
|
||||
|
||||
private IEntityImage svekImage;
|
||||
|
||||
public final IEntityImage getSvekImage() {
|
||||
return svekImage;
|
||||
}
|
||||
|
||||
public final void setSvekImage(IEntityImage svekImage) {
|
||||
this.svekImage = svekImage;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 5190 $
|
||||
* Revision $Revision: 6924 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.cucadiagram;
|
||||
@ -37,11 +37,11 @@ public enum EntityType {
|
||||
|
||||
EMPTY_PACKAGE,
|
||||
|
||||
ABSTRACT_CLASS, CLASS, INTERFACE, LOLLIPOP, ENUM, ACTOR, USECASE, COMPONENT, CIRCLE_INTERFACE, NOTE, OBJECT,
|
||||
ABSTRACT_CLASS, CLASS, INTERFACE, LOLLIPOP, ENUM, ACTOR, USECASE, COMPONENT, CIRCLE_INTERFACE, NOTE, OBJECT, ASSOCIATION,
|
||||
|
||||
ACTIVITY, BRANCH, SYNCHRO_BAR, CIRCLE_START, CIRCLE_END, POINT_FOR_ASSOCIATION, ACTIVITY_CONCURRENT,
|
||||
|
||||
STATE, STATE_CONCURRENT,
|
||||
STATE, STATE_CONCURRENT, PSEUDO_STATE,
|
||||
|
||||
BLOCK,
|
||||
|
||||
|
@ -40,6 +40,7 @@ import java.util.List;
|
||||
import net.sourceforge.plantuml.Url;
|
||||
import net.sourceforge.plantuml.cucadiagram.dot.DrawFile;
|
||||
import net.sourceforge.plantuml.graphic.HtmlColor;
|
||||
import net.sourceforge.plantuml.svek.IEntityImage;
|
||||
|
||||
public abstract class EntityUtils {
|
||||
|
||||
@ -52,8 +53,8 @@ public abstract class EntityUtils {
|
||||
return ent.getFieldsToDisplay();
|
||||
}
|
||||
|
||||
public String getDisplay() {
|
||||
return ent.getDisplay();
|
||||
public List<? extends CharSequence> getDisplay2() {
|
||||
return ent.getDisplay2();
|
||||
}
|
||||
|
||||
public Group getParent() {
|
||||
@ -92,7 +93,7 @@ public abstract class EntityUtils {
|
||||
return ent.getSpecificBackColor();
|
||||
}
|
||||
|
||||
public void setSpecificBackcolor(String specificBackcolor) {
|
||||
public void setSpecificBackcolor(HtmlColor specificBackcolor) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@ -135,6 +136,22 @@ public abstract class EntityUtils {
|
||||
ent.setNearDecoration(nearDecoration);
|
||||
}
|
||||
|
||||
public int compareTo(IEntity other) {
|
||||
return ent.compareTo(other);
|
||||
}
|
||||
|
||||
public int getXposition() {
|
||||
return ent.getXposition();
|
||||
}
|
||||
|
||||
public void setXposition(int pos) {
|
||||
ent.setXposition(pos);
|
||||
}
|
||||
|
||||
public IEntityImage getSvekImage() {
|
||||
return ent.getSvekImage();
|
||||
}
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 5743 $
|
||||
* Revision $Revision: 6709 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.cucadiagram;
|
||||
@ -39,6 +39,7 @@ import java.util.Collections;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import net.sourceforge.plantuml.StringUtils;
|
||||
import net.sourceforge.plantuml.UniqueSequence;
|
||||
import net.sourceforge.plantuml.graphic.HtmlColor;
|
||||
|
||||
@ -163,7 +164,15 @@ public class Group {
|
||||
}
|
||||
|
||||
public String getUid() {
|
||||
return "cluster" + cpt;
|
||||
return StringUtils.getUid(getUid1(), getUid2());
|
||||
}
|
||||
|
||||
public String getUid1() {
|
||||
return "cluster";
|
||||
}
|
||||
|
||||
public int getUid2() {
|
||||
return cpt;
|
||||
}
|
||||
|
||||
public final HtmlColor getBackColor() {
|
||||
|
@ -40,12 +40,13 @@ import java.util.List;
|
||||
import net.sourceforge.plantuml.SpecificBackcolorable;
|
||||
import net.sourceforge.plantuml.Url;
|
||||
import net.sourceforge.plantuml.cucadiagram.dot.DrawFile;
|
||||
import net.sourceforge.plantuml.svek.IEntityImage;
|
||||
|
||||
public interface IEntity extends Imaged, SpecificBackcolorable {
|
||||
public interface IEntity extends Imaged, SpecificBackcolorable, Comparable<IEntity> {
|
||||
|
||||
public Group getParent();
|
||||
|
||||
public String getDisplay();
|
||||
public List<? extends CharSequence> getDisplay2();
|
||||
|
||||
public EntityType getType();
|
||||
|
||||
@ -73,4 +74,10 @@ public interface IEntity extends Imaged, SpecificBackcolorable {
|
||||
|
||||
public void setNearDecoration(boolean nearDecoration);
|
||||
|
||||
public int getXposition();
|
||||
|
||||
public void setXposition(int pos);
|
||||
|
||||
public IEntityImage getSvekImage();
|
||||
|
||||
}
|
||||
|
@ -28,17 +28,18 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 6356 $
|
||||
* Revision $Revision: 6939 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.cucadiagram;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Font;
|
||||
import java.awt.geom.Dimension2D;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import net.sourceforge.plantuml.StringUtils;
|
||||
import net.sourceforge.plantuml.UniqueSequence;
|
||||
import net.sourceforge.plantuml.command.Position;
|
||||
import net.sourceforge.plantuml.cucadiagram.dot.DrawFile;
|
||||
import net.sourceforge.plantuml.graphic.FontConfiguration;
|
||||
import net.sourceforge.plantuml.graphic.HorizontalAlignement;
|
||||
@ -46,6 +47,7 @@ import net.sourceforge.plantuml.graphic.HtmlColor;
|
||||
import net.sourceforge.plantuml.graphic.StringBounder;
|
||||
import net.sourceforge.plantuml.graphic.TextBlock;
|
||||
import net.sourceforge.plantuml.graphic.TextBlockUtils;
|
||||
import net.sourceforge.plantuml.ugraphic.UFont;
|
||||
|
||||
public class Link implements Imaged {
|
||||
|
||||
@ -60,7 +62,10 @@ public class Link implements Imaged {
|
||||
final private String uid = "LNK" + UniqueSequence.getValue();
|
||||
|
||||
private DrawFile imageFile;
|
||||
private String note;
|
||||
|
||||
private List<? extends CharSequence> note;
|
||||
private Position notePosition;
|
||||
|
||||
private boolean invis = false;
|
||||
private double weight = 1.0;
|
||||
|
||||
@ -69,6 +74,11 @@ public class Link implements Imaged {
|
||||
|
||||
private HtmlColor specificColor;
|
||||
private boolean constraint = true;
|
||||
private boolean inverted = false;
|
||||
|
||||
public final boolean isInverted() {
|
||||
return inverted;
|
||||
}
|
||||
|
||||
public Link(IEntity cl1, IEntity cl2, LinkType type, String label, int length) {
|
||||
this(cl1, cl2, type, label, length, null, null, null, null, null);
|
||||
@ -106,8 +116,14 @@ public class Link implements Imaged {
|
||||
}
|
||||
|
||||
public Link getInv() {
|
||||
return new Link(cl2, cl1, type.getInv(), label, length, qualifier2, qualifier1, labeldistance, labelangle,
|
||||
specificColor);
|
||||
// if (getLength() == 1) {
|
||||
// final int x = cl1.getXposition();
|
||||
// cl2.setXposition(x-1);
|
||||
// }
|
||||
final Link result = new Link(cl2, cl1, type.getInv(), label, length, qualifier2, qualifier1, labeldistance,
|
||||
labelangle, specificColor);
|
||||
result.inverted = true;
|
||||
return result;
|
||||
}
|
||||
|
||||
public Link getDashed() {
|
||||
@ -222,12 +238,22 @@ public class Link implements Imaged {
|
||||
this.weight = weight;
|
||||
}
|
||||
|
||||
public final String getNote() {
|
||||
public final List<? extends CharSequence> getNote() {
|
||||
return note;
|
||||
}
|
||||
|
||||
public final void setNote(String note) {
|
||||
public final Position getNotePosition() {
|
||||
return notePosition;
|
||||
}
|
||||
|
||||
public final void addNote(List<? extends CharSequence> note, Position position) {
|
||||
this.note = note;
|
||||
this.notePosition = position;
|
||||
}
|
||||
|
||||
public final void addNote(String n, Position position) {
|
||||
this.note = StringUtils.getWithNewlines(n);
|
||||
this.notePosition = position;
|
||||
}
|
||||
|
||||
public DrawFile getImageFile() {
|
||||
@ -291,22 +317,22 @@ public class Link implements Imaged {
|
||||
return false;
|
||||
}
|
||||
|
||||
public double getMarginDecors1(StringBounder stringBounder, Font fontQualif) {
|
||||
public double getMarginDecors1(StringBounder stringBounder, UFont fontQualif) {
|
||||
final double q = getQualifierMargin(stringBounder, fontQualif, qualifier1);
|
||||
final LinkDecor decor = type.getDecor1();
|
||||
return decor.getSize() + q;
|
||||
}
|
||||
|
||||
public double getMarginDecors2(StringBounder stringBounder, Font fontQualif) {
|
||||
public double getMarginDecors2(StringBounder stringBounder, UFont fontQualif) {
|
||||
final double q = getQualifierMargin(stringBounder, fontQualif, qualifier2);
|
||||
final LinkDecor decor = type.getDecor2();
|
||||
return decor.getSize() + q;
|
||||
}
|
||||
|
||||
private double getQualifierMargin(StringBounder stringBounder, Font fontQualif, String qualif) {
|
||||
private double getQualifierMargin(StringBounder stringBounder, UFont fontQualif, String qualif) {
|
||||
if (qualif != null) {
|
||||
final TextBlock b = TextBlockUtils.create(Arrays.asList(qualif), new FontConfiguration(fontQualif,
|
||||
Color.BLACK), HorizontalAlignement.LEFT);
|
||||
HtmlColor.BLACK), HorizontalAlignement.LEFT);
|
||||
final Dimension2D dim = b.calculateDimension(stringBounder);
|
||||
return Math.max(dim.getWidth(), dim.getHeight());
|
||||
}
|
||||
@ -328,5 +354,4 @@ public class Link implements Imaged {
|
||||
public final void setConstraint(boolean constraint) {
|
||||
this.constraint = constraint;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -35,12 +35,14 @@ package net.sourceforge.plantuml.cucadiagram;
|
||||
|
||||
public enum LinkDecor {
|
||||
|
||||
NONE(2), EXTENDS(30), COMPOSITION(15), AGREGATION(15), ARROW(10), PLUS(0), SQUARRE(30);
|
||||
NONE(2, false), EXTENDS(30, false), COMPOSITION(15, true), AGREGATION(15, false), ARROW(10, true), PLUS(0, false), SQUARRE(30, false);
|
||||
|
||||
private final int size;
|
||||
private final boolean fill;
|
||||
|
||||
private LinkDecor(int size) {
|
||||
private LinkDecor(int size, boolean fill) {
|
||||
this.size = size;
|
||||
this.fill = fill;
|
||||
}
|
||||
|
||||
public String getArrowDot() {
|
||||
@ -65,4 +67,8 @@ public enum LinkDecor {
|
||||
return size;
|
||||
}
|
||||
|
||||
public boolean isFill() {
|
||||
return fill;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -33,6 +33,8 @@
|
||||
*/
|
||||
package net.sourceforge.plantuml.cucadiagram;
|
||||
|
||||
import net.sourceforge.plantuml.ugraphic.UStroke;
|
||||
|
||||
public class LinkType {
|
||||
|
||||
private final LinkDecor decor1;
|
||||
@ -177,4 +179,16 @@ public class LinkType {
|
||||
return new LinkType(LinkDecor.NONE, style, decor2);
|
||||
}
|
||||
|
||||
public UStroke getStroke() {
|
||||
if (style == LinkStyle.DASHED) {
|
||||
return new UStroke(7, 7, 1);
|
||||
}
|
||||
if (style == LinkStyle.DOTTED) {
|
||||
return new UStroke(1, 3, 1);
|
||||
}
|
||||
if (style == LinkStyle.BOLD) {
|
||||
return new UStroke(2);
|
||||
}
|
||||
return new UStroke();
|
||||
}
|
||||
}
|
||||
|
@ -28,18 +28,20 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 5982 $
|
||||
* Revision $Revision: 6934 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.cucadiagram;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Font;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import net.sourceforge.plantuml.StringUtils;
|
||||
import net.sourceforge.plantuml.graphic.HtmlColor;
|
||||
import net.sourceforge.plantuml.ugraphic.UFont;
|
||||
|
||||
public class Stereotype implements CharSequence {
|
||||
|
||||
@ -50,9 +52,9 @@ public class Stereotype implements CharSequence {
|
||||
private final HtmlColor htmlColor;
|
||||
private final char character;
|
||||
private final double radius;
|
||||
private final Font circledFont;
|
||||
private final UFont circledFont;
|
||||
|
||||
public Stereotype(String label, double radius, Font circledFont) {
|
||||
public Stereotype(String label, double radius, UFont circledFont) {
|
||||
if (label == null) {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
@ -86,11 +88,8 @@ public class Stereotype implements CharSequence {
|
||||
this.circledFont = null;
|
||||
}
|
||||
|
||||
public Color getColor() {
|
||||
if (htmlColor == null) {
|
||||
return null;
|
||||
}
|
||||
return htmlColor.getColor();
|
||||
public HtmlColor getHtmlColor() {
|
||||
return htmlColor;
|
||||
}
|
||||
|
||||
public char getCharacter() {
|
||||
@ -133,8 +132,21 @@ public class Stereotype implements CharSequence {
|
||||
return radius;
|
||||
}
|
||||
|
||||
public final Font getCircledFont() {
|
||||
public final UFont getCircledFont() {
|
||||
return circledFont;
|
||||
}
|
||||
|
||||
public List<String> getLabels() {
|
||||
if (label==null) {
|
||||
return null;
|
||||
}
|
||||
final List<String> result = new ArrayList<String>();
|
||||
final Pattern p = Pattern.compile("\\<\\<.*?\\>\\>");
|
||||
final Matcher m = p.matcher(label);
|
||||
while (m.find()) {
|
||||
result.add(m.group());
|
||||
}
|
||||
return Collections.unmodifiableList(result);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 6104 $
|
||||
* Revision $Revision: 6711 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.cucadiagram.dot;
|
||||
@ -37,6 +37,7 @@ import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import net.sourceforge.plantuml.FileFormat;
|
||||
@ -80,7 +81,7 @@ abstract class AbstractGraphviz implements Graphviz {
|
||||
|
||||
abstract protected File specificDotExe();
|
||||
|
||||
final public void createPng(OutputStream os) throws IOException, InterruptedException {
|
||||
final public void createFile(OutputStream os) throws IOException, InterruptedException {
|
||||
if (dotString == null) {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
@ -97,6 +98,8 @@ abstract class AbstractGraphviz implements Graphviz {
|
||||
p = new ProcessRunner(cmd);
|
||||
p.run(dotString.getBytes(), os);
|
||||
Log.info("Ending process ok");
|
||||
} catch (InterruptedException e) {
|
||||
Log.error("Interrupted");
|
||||
} catch (Throwable e) {
|
||||
e.printStackTrace();
|
||||
Log.error("Error: " + e);
|
||||
@ -131,6 +134,11 @@ abstract class AbstractGraphviz implements Graphviz {
|
||||
return executeCmd(cmd);
|
||||
}
|
||||
|
||||
public String testFile(String dotfilename, String outfile) throws IOException, InterruptedException {
|
||||
final String cmd = getCommandLine() + "-o" + outfile + " " + dotfilename;
|
||||
return executeCmd(cmd);
|
||||
}
|
||||
|
||||
private String executeCmd(final String cmd) throws IOException, InterruptedException {
|
||||
final ProcessRunner p = new ProcessRunner(cmd);
|
||||
p.run(null, null);
|
||||
@ -188,4 +196,12 @@ abstract class AbstractGraphviz implements Graphviz {
|
||||
}
|
||||
}
|
||||
|
||||
public final String getDotString() {
|
||||
return dotString;
|
||||
}
|
||||
|
||||
public final List<String> getType() {
|
||||
return Arrays.asList(type);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -62,10 +62,11 @@ class AbstractGraphviz2 implements Graphviz {
|
||||
this.strategy = strategy;
|
||||
this.dotString = dotString;
|
||||
this.type = type;
|
||||
throw new UnsupportedOperationException("not used yet");
|
||||
}
|
||||
|
||||
|
||||
final public void createPng(OutputStream os) throws IOException, InterruptedException {
|
||||
final public void createFile(OutputStream os) throws IOException, InterruptedException {
|
||||
if (dotString == null) {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
@ -181,4 +182,9 @@ class AbstractGraphviz2 implements Graphviz {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public String testFile(String filename, String outfile) throws IOException, InterruptedException {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -37,7 +37,8 @@ package net.sourceforge.plantuml.cucadiagram.dot;
|
||||
enum BorderMode {
|
||||
|
||||
NO_BORDER,
|
||||
NO_BORDER_CELLSPACING,
|
||||
NO_BORDER_CELLSPACING_OLD,
|
||||
NO_BORDER_CELLSPACING_NEW,
|
||||
BORDER_1_WITH_COLOR,
|
||||
BORDER_1_WITHOUT_COLOR;
|
||||
|
||||
|
@ -28,21 +28,18 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 6474 $
|
||||
* Revision $Revision: 6939 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.cucadiagram.dot;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Font;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.geom.Dimension2D;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
@ -59,7 +56,6 @@ import java.util.regex.Pattern;
|
||||
import javax.imageio.ImageIO;
|
||||
|
||||
import net.sourceforge.plantuml.ColorParam;
|
||||
import net.sourceforge.plantuml.Dimension2DDouble;
|
||||
import net.sourceforge.plantuml.EmptyImageBuilder;
|
||||
import net.sourceforge.plantuml.FileFormat;
|
||||
import net.sourceforge.plantuml.FileFormatOption;
|
||||
@ -76,14 +72,13 @@ import net.sourceforge.plantuml.UniqueSequence;
|
||||
import net.sourceforge.plantuml.cucadiagram.CucaDiagram;
|
||||
import net.sourceforge.plantuml.cucadiagram.Entity;
|
||||
import net.sourceforge.plantuml.cucadiagram.EntityType;
|
||||
import net.sourceforge.plantuml.cucadiagram.Group;
|
||||
import net.sourceforge.plantuml.cucadiagram.IEntity;
|
||||
import net.sourceforge.plantuml.cucadiagram.Imaged;
|
||||
import net.sourceforge.plantuml.cucadiagram.Link;
|
||||
import net.sourceforge.plantuml.cucadiagram.Stereotype;
|
||||
import net.sourceforge.plantuml.eps.EpsGraphics;
|
||||
import net.sourceforge.plantuml.eps.EpsStrategy;
|
||||
import net.sourceforge.plantuml.eps.EpsTitler;
|
||||
import net.sourceforge.plantuml.eps.SvgToEpsConverter;
|
||||
import net.sourceforge.plantuml.graphic.CircledCharacter;
|
||||
import net.sourceforge.plantuml.graphic.GraphicStrings;
|
||||
import net.sourceforge.plantuml.graphic.HorizontalAlignement;
|
||||
@ -104,12 +99,14 @@ import net.sourceforge.plantuml.skin.SimpleContext2D;
|
||||
import net.sourceforge.plantuml.skin.StickMan;
|
||||
import net.sourceforge.plantuml.skin.rose.Rose;
|
||||
import net.sourceforge.plantuml.statediagram.StateDiagram;
|
||||
import net.sourceforge.plantuml.svg.SvgData;
|
||||
import net.sourceforge.plantuml.svg.SvgTitler;
|
||||
import net.sourceforge.plantuml.ugraphic.UFont;
|
||||
import net.sourceforge.plantuml.ugraphic.eps.UGraphicEps;
|
||||
import net.sourceforge.plantuml.ugraphic.g2d.UGraphicG2d;
|
||||
import net.sourceforge.plantuml.ugraphic.svg.UGraphicSvg;
|
||||
|
||||
public final class CucaDiagramFileMaker {
|
||||
public final class CucaDiagramFileMaker implements ICucaDiagramFileMaker {
|
||||
|
||||
private final CucaDiagram diagram;
|
||||
private final List<BufferedImage> flashcodes;
|
||||
@ -124,7 +121,7 @@ public final class CucaDiagramFileMaker {
|
||||
}
|
||||
|
||||
public CucaDiagramFileMaker(CucaDiagram diagram, List<BufferedImage> flashcodes) throws IOException {
|
||||
HtmlColor.setForceMonochrome(diagram.getSkinParam().isMonochrome());
|
||||
// HtmlColor.setForceMonochrome(diagram.getSkinParam().isMonochrome());
|
||||
this.diagram = diagram;
|
||||
this.flashcodes = flashcodes;
|
||||
if (diagram.getUmlDiagramType() == UmlDiagramType.CLASS || diagram.getUmlDiagramType() == UmlDiagramType.OBJECT) {
|
||||
@ -156,8 +153,8 @@ public final class CucaDiagramFileMaker {
|
||||
return createPng(os, dotStrings, fileFormatOption);
|
||||
} else if (fileFormat == FileFormat.SVG) {
|
||||
return createSvg(os, dotStrings, fileFormatOption);
|
||||
} else if (fileFormat == FileFormat.EPS_VIA_SVG) {
|
||||
return createEpsViaSvg(os, dotStrings, fileFormatOption);
|
||||
} else if (fileFormat == FileFormat.EPS_TEXT) {
|
||||
return createEps(os, dotStrings, fileFormatOption);
|
||||
} else if (fileFormat == FileFormat.EPS) {
|
||||
return createEps(os, dotStrings, fileFormatOption);
|
||||
} else if (fileFormat == FileFormat.DOT) {
|
||||
@ -168,17 +165,6 @@ public final class CucaDiagramFileMaker {
|
||||
|
||||
}
|
||||
|
||||
private String createEpsViaSvg(OutputStream os, List<String> dotStrings, FileFormatOption fileFormatOption)
|
||||
throws IOException, InterruptedException {
|
||||
final File svgTmp = FileUtils.createTempFile("svgtmp", ".svg");
|
||||
final FileOutputStream svgOs = new FileOutputStream(svgTmp);
|
||||
final String status = createSvg(svgOs, dotStrings, fileFormatOption);
|
||||
svgOs.close();
|
||||
final SvgToEpsConverter converter = new SvgToEpsConverter(svgTmp);
|
||||
converter.createEps(os);
|
||||
return status;
|
||||
}
|
||||
|
||||
private double deltaY;
|
||||
|
||||
private String createSvg(OutputStream os, List<String> dotStrings, FileFormatOption fileFormatOption)
|
||||
@ -187,27 +173,41 @@ public final class CucaDiagramFileMaker {
|
||||
final StringBuilder cmap = new StringBuilder();
|
||||
try {
|
||||
deltaY = 0;
|
||||
String svg = getSvgData(dotStrings, fileFormatOption, cmap);
|
||||
String svg4 = getSvgData(dotStrings, fileFormatOption, cmap);
|
||||
|
||||
final Dimension2D dim = getDimensionSvg(svg);
|
||||
if (dim != null) {
|
||||
SvgData svgData = SvgData.fromGraphViz(svg4);
|
||||
|
||||
double supH = getTitleSvgHeight();
|
||||
supH += getHeaderSvgHeight();
|
||||
supH += getFooterSvgHeight();
|
||||
if (svgData != null) {
|
||||
|
||||
svg = removeSvgXmlHeader(svg, dim.getWidth(), dim.getHeight() + supH);
|
||||
final SvgTitler title = getTitleSvgTitler();
|
||||
final SvgTitler header = getHeaderSvgTitler();
|
||||
final SvgTitler footer = getFooterSvgTitler();
|
||||
|
||||
svg = addTitleSvg(svg, dim.getWidth(), dim.getHeight());
|
||||
svg = addHeaderSvg(svg, dim.getWidth(), dim.getHeight());
|
||||
svg = addFooterSvg(svg, dim.getWidth(), dim.getHeight());
|
||||
svgData = title.addTitle(svgData);
|
||||
svgData = header.addTitle(svgData);
|
||||
svgData = footer.addTitle(svgData);
|
||||
|
||||
// double supH = getTitleSvgHeight(svg);
|
||||
// supH += getHeaderSvgHeight(svg);
|
||||
// supH += getFooterSvgHeight(svg);
|
||||
//
|
||||
// svg = removeSvgXmlHeader1(svg);
|
||||
//
|
||||
// svg = addTitleSvg(svg, dim.getWidth(), dim.getHeight());
|
||||
// svg = addHeaderSvg(svg, dim.getWidth(), dim.getHeight());
|
||||
// svg = addFooterSvg(svg, dim.getWidth(), dim.getHeight());
|
||||
//
|
||||
// svg = modifySvgXmlHeader(svg, dim.getWidth(), dim.getHeight()
|
||||
// + supH, -50, 0);
|
||||
|
||||
// Image management
|
||||
final Pattern pImage = Pattern.compile("(?i)<image\\W[^>]*>");
|
||||
|
||||
svg4 = svgData.getSvg();
|
||||
boolean changed;
|
||||
do {
|
||||
changed = false;
|
||||
final Matcher mImage = pImage.matcher(svg);
|
||||
final Matcher mImage = pImage.matcher(svg4);
|
||||
final StringBuffer sb = new StringBuffer();
|
||||
while (mImage.find()) {
|
||||
final String image = mImage.group(0);
|
||||
@ -232,11 +232,11 @@ public final class CucaDiagramFileMaker {
|
||||
}
|
||||
}
|
||||
mImage.appendTail(sb);
|
||||
svg = sb.toString();
|
||||
svg4 = sb.toString();
|
||||
} while (changed);
|
||||
}
|
||||
|
||||
os.write(svg.getBytes("UTF-8"));
|
||||
os.write(svg4.getBytes("UTF-8"));
|
||||
|
||||
// final ByteArrayInputStream bais = new
|
||||
// ByteArrayInputStream(baos.toByteArray());
|
||||
@ -260,8 +260,7 @@ public final class CucaDiagramFileMaker {
|
||||
//
|
||||
// PngIO.write(im, os, diagram.getMetadata());
|
||||
} finally {
|
||||
// cleanTemporaryFiles(diagram.entities().values());
|
||||
// cleanTemporaryFiles(diagram.getLinks());
|
||||
clean();
|
||||
}
|
||||
if (cmap.length() > 0) {
|
||||
return translateXY(cmap.toString(), 0, (int) Math.round(deltaY));
|
||||
@ -319,53 +318,13 @@ public final class CucaDiagramFileMaker {
|
||||
final Graphviz graphviz = GraphvizUtils.create(dotString, "svg");
|
||||
|
||||
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
graphviz.createPng(baos);
|
||||
graphviz.createFile(baos);
|
||||
baos.close();
|
||||
dotMaker.clean();
|
||||
|
||||
return new String(baos.toByteArray(), "UTF-8").replace('\\', '/');
|
||||
}
|
||||
|
||||
private static String removeSvgXmlHeader(String svg, double width, double height) {
|
||||
final String newString = "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" style=\"width:"
|
||||
+ Math.round(width) + ";height:" + Math.round(height) + ";\">";
|
||||
svg = svg.replaceFirst("(?i)<svg[^>]*>", newString);
|
||||
return svg;
|
||||
}
|
||||
|
||||
private Dimension2D getDimensionSvg(String svg) {
|
||||
final Pattern p = Pattern.compile("(?i)<polygon\\s+[^>]*points=\"([^\"]+)\"");
|
||||
final Matcher m = p.matcher(svg);
|
||||
if (m.find() == false) {
|
||||
return null;
|
||||
}
|
||||
final String points = m.group(1);
|
||||
final StringTokenizer st = new StringTokenizer(points, " ");
|
||||
double minX = Double.MAX_VALUE;
|
||||
double minY = Double.MAX_VALUE;
|
||||
double maxX = -Double.MAX_VALUE;
|
||||
double maxY = -Double.MAX_VALUE;
|
||||
while (st.hasMoreTokens()) {
|
||||
final String token = st.nextToken();
|
||||
final StringTokenizer st2 = new StringTokenizer(token, ",");
|
||||
final double x = Double.parseDouble(st2.nextToken().trim());
|
||||
final double y = Double.parseDouble(st2.nextToken().trim());
|
||||
if (x < minX) {
|
||||
minX = x;
|
||||
}
|
||||
if (y < minY) {
|
||||
minY = y;
|
||||
}
|
||||
if (x > maxX) {
|
||||
maxX = x;
|
||||
}
|
||||
if (y > maxY) {
|
||||
maxY = y;
|
||||
}
|
||||
}
|
||||
return new Dimension2DDouble(maxX - minX, maxY - minY);
|
||||
}
|
||||
|
||||
private DrawFile searchImageFile(File searched, Collection<? extends IEntity> entities) throws IOException {
|
||||
for (IEntity ent : entities) {
|
||||
final DrawFile df = ent.getImageFile(searched);
|
||||
@ -409,7 +368,11 @@ public final class CucaDiagramFileMaker {
|
||||
final double v1 = heightSvg / heightPng;
|
||||
final double v2 = widthSvg / widthPng;
|
||||
final double min = Math.min(v1, v2);
|
||||
return "scale(" + min + " " + min + ")";
|
||||
return "scale(" + format(min) + " " + format(min) + ")";
|
||||
}
|
||||
|
||||
private static String format(double x) {
|
||||
return EpsGraphics.format(x);
|
||||
}
|
||||
|
||||
private static String getValue(String s, String param) {
|
||||
@ -467,7 +430,7 @@ public final class CucaDiagramFileMaker {
|
||||
new UnderlineTrick(im, new Color(Integer.parseInt("FEFECF", 16)), Color.BLACK).process();
|
||||
}
|
||||
|
||||
final Color background = diagram.getSkinParam().getBackgroundColor().getColor();
|
||||
final HtmlColor background = diagram.getSkinParam().getBackgroundColor();
|
||||
|
||||
supY = getTitlePngHeight(stringBounder);
|
||||
supY += getHeaderPngHeight(stringBounder);
|
||||
@ -484,12 +447,11 @@ public final class CucaDiagramFileMaker {
|
||||
}
|
||||
im = PngSizer.process(im, diagram.getMinwidth());
|
||||
|
||||
im = addFlashcode(im, background);
|
||||
im = addFlashcode(im, diagram.getColorMapper().getMappedColor(background));
|
||||
|
||||
PngIO.write(im, os, diagram.getMetadata(), diagram.getDpi(fileFormatOption));
|
||||
} finally {
|
||||
cleanTemporaryFiles(diagram.entities().values());
|
||||
cleanTemporaryFiles(diagram.getLinks());
|
||||
clean();
|
||||
}
|
||||
|
||||
if (cmap.length() > 0) {
|
||||
@ -525,7 +487,7 @@ public final class CucaDiagramFileMaker {
|
||||
final Graphviz graphviz = GraphvizUtils.create(dotString, "cmapx", getPngType());
|
||||
|
||||
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
graphviz.createPng(baos);
|
||||
graphviz.createFile(baos);
|
||||
baos.close();
|
||||
|
||||
final byte[] allData = baos.toByteArray();
|
||||
@ -569,15 +531,12 @@ public final class CucaDiagramFileMaker {
|
||||
final Graphviz graphviz = GraphvizUtils.create(dotString, getPngType());
|
||||
|
||||
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
graphviz.createPng(baos);
|
||||
graphviz.createFile(baos);
|
||||
baos.close();
|
||||
|
||||
final byte[] imageData = baos.toByteArray();
|
||||
// final byte[] imageData = new byte[0];
|
||||
Log.info("Reading " + imageData.length + " bytes from dot");
|
||||
// File f = new File("dummy.png");
|
||||
// FileOutputStream fos = new FileOutputStream(f);
|
||||
// fos.write(imageData);
|
||||
// fos.close();
|
||||
return imageData;
|
||||
}
|
||||
|
||||
@ -602,161 +561,131 @@ public final class CucaDiagramFileMaker {
|
||||
errorResult.writeImage(os, fileFormat);
|
||||
}
|
||||
|
||||
private BufferedImage addTitle(BufferedImage im, final Color background) {
|
||||
final Color titleColor = diagram.getSkinParam().getFontHtmlColor(FontParam.TITLE, null).getColor();
|
||||
final String fontFamily = getSkinParam().getFontFamily(FontParam.TITLE, null);
|
||||
final int fontSize = getSkinParam().getFontSize(FontParam.TITLE, null);
|
||||
final PngTitler pngTitler = new PngTitler(titleColor, diagram.getTitle(), fontSize, fontFamily,
|
||||
HorizontalAlignement.CENTER, VerticalPosition.TOP);
|
||||
private BufferedImage addTitle(BufferedImage im, final HtmlColor background) {
|
||||
final HtmlColor titleColor = diagram.getSkinParam().getFontHtmlColor(FontParam.TITLE, null);
|
||||
final UFont font = getSkinParam().getFont(FontParam.TITLE, null);
|
||||
final String fontFamily = font.getFamily(null);
|
||||
final int fontSize = font.getSize();
|
||||
final PngTitler pngTitler = new PngTitler(diagram.getColorMapper(), titleColor, diagram.getTitle(), fontSize,
|
||||
fontFamily, HorizontalAlignement.CENTER, VerticalPosition.TOP);
|
||||
return pngTitler.processImage(im, background, 3);
|
||||
}
|
||||
|
||||
private double getTitlePngHeight(StringBounder stringBounder) throws IOException {
|
||||
final Color titleColor = diagram.getSkinParam().getFontHtmlColor(FontParam.TITLE, null).getColor();
|
||||
final String fontFamily = getSkinParam().getFontFamily(FontParam.TITLE, null);
|
||||
final int fontSize = getSkinParam().getFontSize(FontParam.TITLE, null);
|
||||
final PngTitler pngTitler = new PngTitler(titleColor, diagram.getTitle(), fontSize, fontFamily,
|
||||
HorizontalAlignement.CENTER, VerticalPosition.TOP);
|
||||
final HtmlColor titleColor = diagram.getSkinParam().getFontHtmlColor(FontParam.TITLE, null);
|
||||
final UFont font = getSkinParam().getFont(FontParam.TITLE, null);
|
||||
final String fontFamily = font.getFamily(null);
|
||||
final int fontSize = font.getSize();
|
||||
final PngTitler pngTitler = new PngTitler(diagram.getColorMapper(), titleColor, diagram.getTitle(), fontSize,
|
||||
fontFamily, HorizontalAlignement.CENTER, VerticalPosition.TOP);
|
||||
return pngTitler.getOffsetY(stringBounder);
|
||||
}
|
||||
|
||||
private double getOffsetX(StringBounder stringBounder, double imWidth) throws IOException {
|
||||
final Color titleColor = diagram.getSkinParam().getFontHtmlColor(FontParam.TITLE, null).getColor();
|
||||
final String fontFamily = getSkinParam().getFontFamily(FontParam.TITLE, null);
|
||||
final int fontSize = getSkinParam().getFontSize(FontParam.TITLE, null);
|
||||
final PngTitler pngTitler = new PngTitler(titleColor, diagram.getTitle(), fontSize, fontFamily,
|
||||
HorizontalAlignement.CENTER, VerticalPosition.TOP);
|
||||
final HtmlColor titleColor = diagram.getSkinParam().getFontHtmlColor(FontParam.TITLE, null);
|
||||
final UFont font = getSkinParam().getFont(FontParam.TITLE, null);
|
||||
final String fontFamily = font.getFamily(null);
|
||||
final int fontSize = font.getSize();
|
||||
final PngTitler pngTitler = new PngTitler(diagram.getColorMapper(), titleColor, diagram.getTitle(), fontSize,
|
||||
fontFamily, HorizontalAlignement.CENTER, VerticalPosition.TOP);
|
||||
return pngTitler.getOffsetX(imWidth, stringBounder);
|
||||
}
|
||||
|
||||
private String addTitleSvg(String svg, double width, double height) throws IOException {
|
||||
final Color titleColor = diagram.getSkinParam().getFontHtmlColor(FontParam.TITLE, null).getColor();
|
||||
final String fontFamily = getSkinParam().getFontFamily(FontParam.TITLE, null);
|
||||
final int fontSize = getSkinParam().getFontSize(FontParam.TITLE, null);
|
||||
private SvgTitler getTitleSvgTitler() throws IOException {
|
||||
final HtmlColor titleColor = diagram.getSkinParam().getFontHtmlColor(FontParam.TITLE, null);
|
||||
final UFont font = getSkinParam().getFont(FontParam.TITLE, null);
|
||||
final String fontFamily = font.getFamily(null);
|
||||
final int fontSize = font.getSize();
|
||||
|
||||
final SvgTitler svgTitler = new SvgTitler(titleColor, diagram.getTitle(), fontSize, fontFamily,
|
||||
return new SvgTitler(diagram.getColorMapper(), titleColor, diagram.getTitle(), fontSize, fontFamily,
|
||||
HorizontalAlignement.CENTER, VerticalPosition.TOP, 3);
|
||||
this.deltaY += svgTitler.getHeight();
|
||||
return svgTitler.addTitleSvg(svg, width, height);
|
||||
}
|
||||
|
||||
private double getTitleSvgHeight() throws IOException {
|
||||
final Color titleColor = diagram.getSkinParam().getFontHtmlColor(FontParam.TITLE, null).getColor();
|
||||
final String fontFamily = getSkinParam().getFontFamily(FontParam.TITLE, null);
|
||||
final int fontSize = getSkinParam().getFontSize(FontParam.TITLE, null);
|
||||
|
||||
final SvgTitler svgTitler = new SvgTitler(titleColor, diagram.getTitle(), fontSize, fontFamily,
|
||||
HorizontalAlignement.CENTER, VerticalPosition.TOP, 3);
|
||||
return svgTitler.getHeight();
|
||||
private SvgTitler getHeaderSvgTitler() throws IOException {
|
||||
final HtmlColor titleColor = diagram.getSkinParam().getFontHtmlColor(FontParam.HEADER, null);
|
||||
final UFont font = getSkinParam().getFont(FontParam.HEADER, null);
|
||||
final String fontFamily = font.getFamily(null);
|
||||
final int fontSize = font.getSize();
|
||||
return new SvgTitler(diagram.getColorMapper(), titleColor, diagram.getHeader(), fontSize, fontFamily, diagram
|
||||
.getHeaderAlignement(), VerticalPosition.TOP, 3);
|
||||
}
|
||||
|
||||
private String addTitleEps(String eps) throws IOException {
|
||||
final Color titleColor = diagram.getSkinParam().getFontHtmlColor(FontParam.TITLE, null).getColor();
|
||||
final String fontFamily = getSkinParam().getFontFamily(FontParam.TITLE, null);
|
||||
final int fontSize = getSkinParam().getFontSize(FontParam.TITLE, null);
|
||||
private SvgTitler getFooterSvgTitler() throws IOException {
|
||||
final HtmlColor titleColor = diagram.getSkinParam().getFontHtmlColor(FontParam.FOOTER, null);
|
||||
final UFont font = getSkinParam().getFont(FontParam.FOOTER, null);
|
||||
final String fontFamily = font.getFamily(null);
|
||||
final int fontSize = font.getSize();
|
||||
return new SvgTitler(diagram.getColorMapper(), titleColor, diagram.getFooter(), fontSize, fontFamily, diagram
|
||||
.getFooterAlignement(), VerticalPosition.BOTTOM, 3);
|
||||
}
|
||||
|
||||
final EpsTitler epsTitler = new EpsTitler(titleColor, diagram.getTitle(), fontSize, fontFamily,
|
||||
HorizontalAlignement.CENTER, VerticalPosition.TOP, 3);
|
||||
private String addTitleEps(EpsStrategy epsStrategy, String eps) throws IOException {
|
||||
final HtmlColor titleColor = diagram.getSkinParam().getFontHtmlColor(FontParam.TITLE, null);
|
||||
final UFont font = getSkinParam().getFont(FontParam.TITLE, null);
|
||||
final String fontFamily = font.getFamily(null);
|
||||
final int fontSize = font.getSize();
|
||||
|
||||
final EpsTitler epsTitler = new EpsTitler(diagram.getColorMapper(), epsStrategy, titleColor,
|
||||
diagram.getTitle(), fontSize, fontFamily, HorizontalAlignement.CENTER, VerticalPosition.TOP, 3);
|
||||
this.deltaY += epsTitler.getHeight();
|
||||
return epsTitler.addTitleEps(eps);
|
||||
}
|
||||
|
||||
private String addFooterEps(String eps) throws IOException {
|
||||
final Color titleColor = diagram.getSkinParam().getFontHtmlColor(FontParam.FOOTER, null).getColor();
|
||||
final String fontFamily = getSkinParam().getFontFamily(FontParam.FOOTER, null);
|
||||
final int fontSize = getSkinParam().getFontSize(FontParam.FOOTER, null);
|
||||
final EpsTitler epsTitler = new EpsTitler(titleColor, diagram.getFooter(), fontSize, fontFamily, diagram
|
||||
.getFooterAlignement(), VerticalPosition.BOTTOM, 3);
|
||||
private String addFooterEps(EpsStrategy epsStrategy, String eps) throws IOException {
|
||||
final HtmlColor titleColor = diagram.getSkinParam().getFontHtmlColor(FontParam.FOOTER, null);
|
||||
final UFont font = getSkinParam().getFont(FontParam.FOOTER, null);
|
||||
final String fontFamily = font.getFamily(null);
|
||||
final int fontSize = font.getSize();
|
||||
final EpsTitler epsTitler = new EpsTitler(diagram.getColorMapper(), epsStrategy, titleColor, diagram
|
||||
.getFooter(), fontSize, fontFamily, diagram.getFooterAlignement(), VerticalPosition.BOTTOM, 3);
|
||||
return epsTitler.addTitleEps(eps);
|
||||
}
|
||||
|
||||
private String addHeaderEps(String eps) throws IOException {
|
||||
final Color titleColor = diagram.getSkinParam().getFontHtmlColor(FontParam.HEADER, null).getColor();
|
||||
final String fontFamily = getSkinParam().getFontFamily(FontParam.HEADER, null);
|
||||
final int fontSize = getSkinParam().getFontSize(FontParam.HEADER, null);
|
||||
final EpsTitler epsTitler = new EpsTitler(titleColor, diagram.getHeader(), fontSize, fontFamily, diagram
|
||||
.getHeaderAlignement(), VerticalPosition.TOP, 3);
|
||||
private String addHeaderEps(EpsStrategy epsStrategy, String eps) throws IOException {
|
||||
final HtmlColor titleColor = diagram.getSkinParam().getFontHtmlColor(FontParam.HEADER, null);
|
||||
final UFont font = getSkinParam().getFont(FontParam.HEADER, null);
|
||||
final String fontFamily = font.getFamily(null);
|
||||
final int fontSize = font.getSize();
|
||||
final EpsTitler epsTitler = new EpsTitler(diagram.getColorMapper(), epsStrategy, titleColor, diagram
|
||||
.getHeader(), fontSize, fontFamily, diagram.getHeaderAlignement(), VerticalPosition.TOP, 3);
|
||||
this.deltaY += epsTitler.getHeight();
|
||||
return epsTitler.addTitleEps(eps);
|
||||
}
|
||||
|
||||
private String addHeaderSvg(String svg, double width, double height) throws IOException {
|
||||
final Color titleColor = diagram.getSkinParam().getFontHtmlColor(FontParam.HEADER, null).getColor();
|
||||
final String fontFamily = getSkinParam().getFontFamily(FontParam.HEADER, null);
|
||||
final int fontSize = getSkinParam().getFontSize(FontParam.HEADER, null);
|
||||
final SvgTitler svgTitler = new SvgTitler(titleColor, diagram.getHeader(), fontSize, fontFamily, diagram
|
||||
.getHeaderAlignement(), VerticalPosition.TOP, 3);
|
||||
this.deltaY += svgTitler.getHeight();
|
||||
return svgTitler.addTitleSvg(svg, width, height);
|
||||
}
|
||||
|
||||
private double getHeaderSvgHeight() throws IOException {
|
||||
final Color titleColor = diagram.getSkinParam().getFontHtmlColor(FontParam.HEADER, null).getColor();
|
||||
final String fontFamily = getSkinParam().getFontFamily(FontParam.HEADER, null);
|
||||
final int fontSize = getSkinParam().getFontSize(FontParam.HEADER, null);
|
||||
final SvgTitler svgTitler = new SvgTitler(titleColor, diagram.getHeader(), fontSize, fontFamily, diagram
|
||||
.getHeaderAlignement(), VerticalPosition.TOP, 3);
|
||||
return svgTitler.getHeight();
|
||||
}
|
||||
|
||||
private String addFooterSvg(String svg, double width, double height) throws IOException {
|
||||
final Color titleColor = diagram.getSkinParam().getFontHtmlColor(FontParam.FOOTER, null).getColor();
|
||||
final String fontFamily = getSkinParam().getFontFamily(FontParam.FOOTER, null);
|
||||
final int fontSize = getSkinParam().getFontSize(FontParam.FOOTER, null);
|
||||
final SvgTitler svgTitler = new SvgTitler(titleColor, diagram.getFooter(), fontSize, fontFamily, diagram
|
||||
.getFooterAlignement(), VerticalPosition.BOTTOM, 3);
|
||||
return svgTitler.addTitleSvg(svg, width, height + deltaY);
|
||||
}
|
||||
|
||||
private double getFooterSvgHeight() throws IOException {
|
||||
final Color titleColor = diagram.getSkinParam().getFontHtmlColor(FontParam.FOOTER, null).getColor();
|
||||
final String fontFamily = getSkinParam().getFontFamily(FontParam.FOOTER, null);
|
||||
final int fontSize = getSkinParam().getFontSize(FontParam.FOOTER, null);
|
||||
final SvgTitler svgTitler = new SvgTitler(titleColor, diagram.getFooter(), fontSize, fontFamily, diagram
|
||||
.getFooterAlignement(), VerticalPosition.BOTTOM, 3);
|
||||
return svgTitler.getHeight();
|
||||
}
|
||||
|
||||
private BufferedImage addFooter(BufferedImage im, final Color background) {
|
||||
final Color titleColor = diagram.getSkinParam().getFontHtmlColor(FontParam.FOOTER, null).getColor();
|
||||
final String fontFamily = getSkinParam().getFontFamily(FontParam.FOOTER, null);
|
||||
final int fontSize = getSkinParam().getFontSize(FontParam.FOOTER, null);
|
||||
final PngTitler pngTitler = new PngTitler(titleColor, diagram.getFooter(), fontSize, fontFamily, diagram
|
||||
.getFooterAlignement(), VerticalPosition.BOTTOM);
|
||||
private BufferedImage addFooter(BufferedImage im, final HtmlColor background) {
|
||||
final HtmlColor titleColor = diagram.getSkinParam().getFontHtmlColor(FontParam.FOOTER, null);
|
||||
final UFont font = getSkinParam().getFont(FontParam.FOOTER, null);
|
||||
final String fontFamily = font.getFamily(null);
|
||||
final int fontSize = font.getSize();
|
||||
final PngTitler pngTitler = new PngTitler(diagram.getColorMapper(), titleColor, diagram.getFooter(), fontSize,
|
||||
fontFamily, diagram.getFooterAlignement(), VerticalPosition.BOTTOM);
|
||||
return pngTitler.processImage(im, background, 3);
|
||||
}
|
||||
|
||||
private BufferedImage addHeader(BufferedImage im, final Color background) throws IOException {
|
||||
final Color titleColor = diagram.getSkinParam().getFontHtmlColor(FontParam.HEADER, null).getColor();
|
||||
final String fontFamily = getSkinParam().getFontFamily(FontParam.HEADER, null);
|
||||
final int fontSize = getSkinParam().getFontSize(FontParam.HEADER, null);
|
||||
final PngTitler pngTitler = new PngTitler(titleColor, diagram.getHeader(), fontSize, fontFamily, diagram
|
||||
.getHeaderAlignement(), VerticalPosition.TOP);
|
||||
private BufferedImage addHeader(BufferedImage im, final HtmlColor background) throws IOException {
|
||||
final HtmlColor titleColor = diagram.getSkinParam().getFontHtmlColor(FontParam.HEADER, null);
|
||||
final UFont font = getSkinParam().getFont(FontParam.HEADER, null);
|
||||
final String fontFamily = font.getFamily(null);
|
||||
final int fontSize = font.getSize();
|
||||
final PngTitler pngTitler = new PngTitler(diagram.getColorMapper(), titleColor, diagram.getHeader(), fontSize,
|
||||
fontFamily, diagram.getHeaderAlignement(), VerticalPosition.TOP);
|
||||
return pngTitler.processImage(im, background, 3);
|
||||
}
|
||||
|
||||
private double getHeaderPngHeight(StringBounder stringBounder) throws IOException {
|
||||
final Color titleColor = diagram.getSkinParam().getFontHtmlColor(FontParam.HEADER, null).getColor();
|
||||
final String fontFamily = getSkinParam().getFontFamily(FontParam.HEADER, null);
|
||||
final int fontSize = getSkinParam().getFontSize(FontParam.HEADER, null);
|
||||
final PngTitler pngTitler = new PngTitler(titleColor, diagram.getHeader(), fontSize, fontFamily, diagram
|
||||
.getHeaderAlignement(), VerticalPosition.TOP);
|
||||
final HtmlColor titleColor = diagram.getSkinParam().getFontHtmlColor(FontParam.HEADER, null);
|
||||
final UFont font = getSkinParam().getFont(FontParam.HEADER, null);
|
||||
final String fontFamily = font.getFamily(null);
|
||||
final int fontSize = font.getSize();
|
||||
final PngTitler pngTitler = new PngTitler(diagram.getColorMapper(), titleColor, diagram.getHeader(), fontSize,
|
||||
fontFamily, diagram.getHeaderAlignement(), VerticalPosition.TOP);
|
||||
return pngTitler.getOffsetY(stringBounder);
|
||||
}
|
||||
|
||||
private void cleanTemporaryFiles(final Collection<? extends Imaged> imageFiles) throws IOException {
|
||||
if (OptionFlags.getInstance().isKeepTmpFiles() == false) {
|
||||
for (Imaged entity : imageFiles) {
|
||||
if (entity.getImageFile() != null) {
|
||||
entity.getImageFile().delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DrawFile createImage(Entity entity, double dpiFactor, int dpi) throws IOException {
|
||||
DrawFile createImage(Entity entity, FileFormatOption option) throws IOException {
|
||||
final double dpiFactor = diagram.getDpiFactor(option);
|
||||
if (entity.getType() == EntityType.NOTE) {
|
||||
return createImageForNote(entity.getDisplay(), entity.getSpecificBackColor(), dpiFactor, dpi);
|
||||
return createImageForNote(entity.getDisplay2(), entity.getSpecificBackColor(), option, entity.getParent());
|
||||
}
|
||||
if (entity.getType() == EntityType.ACTOR) {
|
||||
return createImageForActor(entity, dpiFactor);
|
||||
@ -771,54 +700,24 @@ public final class CucaDiagramFileMaker {
|
||||
return null;
|
||||
}
|
||||
|
||||
private DrawFile createImageForNoteOld2(String display, HtmlColor backColor, double dpiFactor, int dpi)
|
||||
throws IOException {
|
||||
final File fPng = FileUtils.createTempFile("plantumlB", ".png");
|
||||
private DrawFile createImageForNote(List<? extends CharSequence> display2, HtmlColor noteBackColor, final FileFormatOption option,
|
||||
Group parent) throws IOException {
|
||||
|
||||
final Rose skin = new Rose();
|
||||
|
||||
final ISkinParam skinParam = new SkinParamBackcolored(getSkinParam(), backColor);
|
||||
final ISkinParam skinParam = new SkinParamBackcolored(getSkinParam(), noteBackColor);
|
||||
final Component comp = skin
|
||||
.createComponent(ComponentType.NOTE, skinParam, StringUtils.getWithNewlines(display));
|
||||
.createComponent(ComponentType.NOTE, skinParam, display2);
|
||||
|
||||
final double dpiFactor = diagram.getDpiFactor(option);
|
||||
final int width = (int) (comp.getPreferredWidth(stringBounder) * dpiFactor);
|
||||
final int height = (int) (comp.getPreferredHeight(stringBounder) * dpiFactor);
|
||||
|
||||
final Color background = diagram.getSkinParam().getBackgroundColor().getColor();
|
||||
final EmptyImageBuilder builder = new EmptyImageBuilder(width, height, background);
|
||||
final BufferedImage im = builder.getBufferedImage();
|
||||
final Graphics2D g2d = builder.getGraphics2D();
|
||||
|
||||
comp.drawU(new UGraphicG2d(g2d, null, dpiFactor), new Dimension(width, height), new SimpleContext2D(false));
|
||||
PngIO.write(im, fPng, dpi);
|
||||
g2d.dispose();
|
||||
|
||||
final UGraphicSvg ug = new UGraphicSvg(true);
|
||||
comp.drawU(ug, new Dimension(width, height), new SimpleContext2D(false));
|
||||
|
||||
final File fEps = FileUtils.createTempFile("plantumlB", ".eps");
|
||||
final PrintWriter pw = new PrintWriter(fEps);
|
||||
final UGraphicEps uEps = new UGraphicEps(EpsStrategy.getDefault());
|
||||
comp.drawU(uEps, new Dimension(width, height), new SimpleContext2D(false));
|
||||
pw.print(uEps.getEPSCode());
|
||||
pw.close();
|
||||
|
||||
return DrawFile.createFromFile(fPng, getSvg(ug), fEps);
|
||||
final int dpi = diagram.getDpi(option);
|
||||
HtmlColor backgroundColor = diagram.getSkinParam().getBackgroundColor();
|
||||
if (parent != null && parent.getBackColor() != null) {
|
||||
backgroundColor = parent.getBackColor();
|
||||
}
|
||||
|
||||
private DrawFile createImageForNote(String display, HtmlColor backColor, final double dpiFactor, final int dpi)
|
||||
throws IOException {
|
||||
|
||||
final Rose skin = new Rose();
|
||||
|
||||
final ISkinParam skinParam = new SkinParamBackcolored(getSkinParam(), backColor);
|
||||
final Component comp = skin
|
||||
.createComponent(ComponentType.NOTE, skinParam, StringUtils.getWithNewlines(display));
|
||||
|
||||
final int width = (int) (comp.getPreferredWidth(stringBounder) * dpiFactor);
|
||||
final int height = (int) (comp.getPreferredHeight(stringBounder) * dpiFactor);
|
||||
|
||||
final Color background = diagram.getSkinParam().getBackgroundColor().getColor();
|
||||
final Color background = diagram.getColorMapper().getMappedColor(backgroundColor);
|
||||
|
||||
final Lazy<File> lpng = new Lazy<File>() {
|
||||
|
||||
@ -828,8 +727,8 @@ public final class CucaDiagramFileMaker {
|
||||
final BufferedImage im = builder.getBufferedImage();
|
||||
final Graphics2D g2d = builder.getGraphics2D();
|
||||
|
||||
comp.drawU(new UGraphicG2d(g2d, null, dpiFactor), new Dimension(width, height), new SimpleContext2D(
|
||||
false));
|
||||
comp.drawU(new UGraphicG2d(diagram.getColorMapper(), g2d, null, dpiFactor),
|
||||
new Dimension(width, height), new SimpleContext2D(false));
|
||||
PngIO.write(im, fPng, dpi);
|
||||
g2d.dispose();
|
||||
return fPng;
|
||||
@ -838,7 +737,7 @@ public final class CucaDiagramFileMaker {
|
||||
|
||||
final Lazy<String> lsvg = new Lazy<String>() {
|
||||
public String getNow() throws IOException {
|
||||
final UGraphicSvg ug = new UGraphicSvg(true);
|
||||
final UGraphicSvg ug = new UGraphicSvg(getSkinParam().getColorMapper(), true);
|
||||
comp.drawU(ug, new Dimension(width, height), new SimpleContext2D(false));
|
||||
return getSvg(ug);
|
||||
}
|
||||
@ -848,7 +747,8 @@ public final class CucaDiagramFileMaker {
|
||||
public File getNow() throws IOException {
|
||||
final File fEps = FileUtils.createTempFile("plantumlB", ".eps");
|
||||
final PrintWriter pw = new PrintWriter(fEps);
|
||||
final UGraphicEps uEps = new UGraphicEps(EpsStrategy.getDefault());
|
||||
final UGraphicEps uEps = new UGraphicEps(getSkinParam().getColorMapper(), getEpsStrategy(option
|
||||
.getFileFormat()));
|
||||
comp.drawU(uEps, new Dimension(width, height), new SimpleContext2D(false));
|
||||
pw.print(uEps.getEPSCode());
|
||||
pw.close();
|
||||
@ -875,23 +775,24 @@ public final class CucaDiagramFileMaker {
|
||||
|
||||
private DrawFile createImageForCircleInterface(Entity entity, final double dpiFactor) throws IOException {
|
||||
final String stereo = entity.getStereotype() == null ? null : entity.getStereotype().getLabel();
|
||||
final Color interfaceBackground = rose.getHtmlColor(getSkinParam(), ColorParam.componentInterfaceBackground,
|
||||
stereo).getColor();
|
||||
final Color interfaceBorder = rose.getHtmlColor(getSkinParam(), ColorParam.componentInterfaceBorder, stereo)
|
||||
.getColor();
|
||||
final Color background = rose.getHtmlColor(getSkinParam(), ColorParam.background, stereo).getColor();
|
||||
final HtmlColor interfaceBackground = rose.getHtmlColor(getSkinParam(),
|
||||
ColorParam.componentInterfaceBackground, stereo);
|
||||
final HtmlColor interfaceBorder = rose
|
||||
.getHtmlColor(getSkinParam(), ColorParam.componentInterfaceBorder, stereo);
|
||||
final HtmlColor background = rose.getHtmlColor(getSkinParam(), ColorParam.background, stereo);
|
||||
final CircleInterface circleInterface = new CircleInterface(interfaceBackground, interfaceBorder);
|
||||
|
||||
final Lazy<File> lpng = new Lazy<File>() {
|
||||
|
||||
public File getNow() throws IOException {
|
||||
final EmptyImageBuilder builder = new EmptyImageBuilder(circleInterface.getPreferredWidth(null)
|
||||
* dpiFactor, circleInterface.getPreferredHeight(null) * dpiFactor, background);
|
||||
* dpiFactor, circleInterface.getPreferredHeight(null) * dpiFactor, diagram.getColorMapper()
|
||||
.getMappedColor(background));
|
||||
|
||||
final BufferedImage im = builder.getBufferedImage();
|
||||
final Graphics2D g2d = builder.getGraphics2D();
|
||||
|
||||
circleInterface.drawU(new UGraphicG2d(g2d, null, 1.0));
|
||||
circleInterface.drawU(new UGraphicG2d(diagram.getColorMapper(), g2d, null, 1.0));
|
||||
|
||||
final File png = FileUtils.createTempFile("circleinterface", ".png");
|
||||
ImageIO.write(im, "png", png);
|
||||
@ -902,14 +803,14 @@ public final class CucaDiagramFileMaker {
|
||||
final Lazy<File> leps = new Lazy<File>() {
|
||||
public File getNow() throws IOException {
|
||||
final File epsFile = FileUtils.createTempFile("circleinterface", ".eps");
|
||||
UGraphicEps.copyEpsToFile(circleInterface, epsFile);
|
||||
UGraphicEps.copyEpsToFile(getSkinParam().getColorMapper(), circleInterface, epsFile);
|
||||
return epsFile;
|
||||
}
|
||||
};
|
||||
|
||||
final Lazy<String> lsvg = new Lazy<String>() {
|
||||
public String getNow() throws IOException {
|
||||
return UGraphicG2d.getSvgString(circleInterface);
|
||||
return UGraphicG2d.getSvgString(getSkinParam().getColorMapper(), circleInterface);
|
||||
}
|
||||
|
||||
};
|
||||
@ -922,21 +823,21 @@ public final class CucaDiagramFileMaker {
|
||||
|
||||
private DrawFile createImageForActor(Entity entity, final double dpiFactor) throws IOException {
|
||||
final String stereo = entity.getStereotype() == null ? null : entity.getStereotype().getLabel();
|
||||
final Color actorBackground = rose.getHtmlColor(getSkinParam(), ColorParam.usecaseActorBackground, stereo)
|
||||
.getColor();
|
||||
final Color actorBorder = rose.getHtmlColor(getSkinParam(), ColorParam.usecaseActorBorder, stereo).getColor();
|
||||
final Color background = rose.getHtmlColor(getSkinParam(), ColorParam.background, stereo).getColor();
|
||||
final HtmlColor actorBackground = rose.getHtmlColor(getSkinParam(), ColorParam.usecaseActorBackground, stereo);
|
||||
final HtmlColor actorBorder = rose.getHtmlColor(getSkinParam(), ColorParam.usecaseActorBorder, stereo);
|
||||
final HtmlColor background = rose.getHtmlColor(getSkinParam(), ColorParam.background, stereo);
|
||||
final StickMan stickMan = new StickMan(actorBackground, actorBorder);
|
||||
|
||||
final Lazy<File> lpng = new Lazy<File>() {
|
||||
public File getNow() throws IOException {
|
||||
final EmptyImageBuilder builder = new EmptyImageBuilder(stickMan.getPreferredWidth(null) * dpiFactor,
|
||||
stickMan.getPreferredHeight(null) * dpiFactor, background);
|
||||
stickMan.getPreferredHeight(null) * dpiFactor, diagram.getColorMapper().getMappedColor(
|
||||
background));
|
||||
|
||||
final BufferedImage im = builder.getBufferedImage();
|
||||
final Graphics2D g2d = builder.getGraphics2D();
|
||||
|
||||
stickMan.drawU(new UGraphicG2d(g2d, null, dpiFactor));
|
||||
stickMan.drawU(new UGraphicG2d(diagram.getColorMapper(), g2d, null, dpiFactor));
|
||||
|
||||
final File png = FileUtils.createTempFile("actor", ".png");
|
||||
ImageIO.write(im, "png", png);
|
||||
@ -946,14 +847,14 @@ public final class CucaDiagramFileMaker {
|
||||
final Lazy<File> leps = new Lazy<File>() {
|
||||
public File getNow() throws IOException {
|
||||
final File epsFile = FileUtils.createTempFile("actor", ".eps");
|
||||
UGraphicEps.copyEpsToFile(stickMan, epsFile);
|
||||
UGraphicEps.copyEpsToFile(getSkinParam().getColorMapper(), stickMan, epsFile);
|
||||
return epsFile;
|
||||
}
|
||||
};
|
||||
|
||||
final Lazy<String> lsvg = new Lazy<String>() {
|
||||
public String getNow() throws IOException {
|
||||
return UGraphicG2d.getSvgString(stickMan);
|
||||
return UGraphicG2d.getSvgString(getSkinParam().getColorMapper(), stickMan);
|
||||
}
|
||||
|
||||
};
|
||||
@ -966,24 +867,31 @@ public final class CucaDiagramFileMaker {
|
||||
private DrawFile createImageForCircleCharacter(Entity entity, double dpiFactor) throws IOException {
|
||||
final Stereotype stereotype = entity.getStereotype();
|
||||
|
||||
if (stereotype == null || stereotype.getColor() == null) {
|
||||
if (stereotype == null || stereotype.getHtmlColor() == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
final String stereo = stereotype.getLabel();
|
||||
|
||||
final Color classBorder = rose.getHtmlColor(getSkinParam(), ColorParam.classBorder, stereo).getColor();
|
||||
final Color classBackground = rose.getHtmlColor(getSkinParam(), ColorParam.classBackground, stereo).getColor();
|
||||
final Font font = diagram.getSkinParam().getFont(FontParam.CIRCLED_CHARACTER, stereo);
|
||||
final HtmlColor classBorder = rose.getHtmlColor(getSkinParam(), ColorParam.classBorder, stereo);
|
||||
final HtmlColor classBackground = rose.getHtmlColor(getSkinParam(), ColorParam.classBackground, stereo);
|
||||
final UFont font = diagram.getSkinParam().getFont(FontParam.CIRCLED_CHARACTER, stereo);
|
||||
final CircledCharacter circledCharacter = new CircledCharacter(stereotype.getCharacter(), getSkinParam()
|
||||
.getCircledCharacterRadius(), font, stereotype.getColor(), classBorder, Color.BLACK);
|
||||
return circledCharacter.generateCircleCharacter(classBackground, dpiFactor);
|
||||
.getCircledCharacterRadius(), font, stereotype.getHtmlColor(), classBorder, HtmlColor.BLACK);
|
||||
return circledCharacter.generateCircleCharacter(diagram.getColorMapper(), classBackground, dpiFactor);
|
||||
}
|
||||
|
||||
private ISkinParam getSkinParam() {
|
||||
return diagram.getSkinParam();
|
||||
}
|
||||
|
||||
private EpsStrategy getEpsStrategy(FileFormat format) {
|
||||
if (format == FileFormat.EPS_TEXT) {
|
||||
return EpsStrategy.WITH_MACRO_AND_TEXT;
|
||||
}
|
||||
return EpsStrategy.getDefault2();
|
||||
}
|
||||
|
||||
private String createEps(OutputStream os, List<String> dotStrings, FileFormatOption fileFormatOption)
|
||||
throws IOException, InterruptedException {
|
||||
|
||||
@ -1000,7 +908,7 @@ public final class CucaDiagramFileMaker {
|
||||
final Graphviz graphviz = GraphvizUtils.create(dotString, "eps");
|
||||
|
||||
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
graphviz.createPng(baos);
|
||||
graphviz.createFile(baos);
|
||||
baos.close();
|
||||
|
||||
dotMaker.clean();
|
||||
@ -1013,13 +921,13 @@ public final class CucaDiagramFileMaker {
|
||||
}
|
||||
|
||||
if (diagram.getTitle() != null) {
|
||||
eps = addTitleEps(eps);
|
||||
eps = addTitleEps(getEpsStrategy(fileFormatOption.getFileFormat()), eps);
|
||||
}
|
||||
if (diagram.getFooter() != null) {
|
||||
eps = addFooterEps(eps);
|
||||
eps = addFooterEps(getEpsStrategy(fileFormatOption.getFileFormat()), eps);
|
||||
}
|
||||
if (diagram.getHeader() != null) {
|
||||
eps = addHeaderEps(eps);
|
||||
eps = addHeaderEps(getEpsStrategy(fileFormatOption.getFileFormat()), eps);
|
||||
}
|
||||
|
||||
os.write(eps.getBytes("UTF-8"));
|
||||
@ -1064,16 +972,24 @@ public final class CucaDiagramFileMaker {
|
||||
// svg = sb.toString();
|
||||
|
||||
} finally {
|
||||
// cleanTemporaryFiles(diagram.entities().values());
|
||||
// cleanTemporaryFiles(diagram.getLinks());
|
||||
clean();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private void clean() throws IOException {
|
||||
if (OptionFlags.getInstance().isKeepTmpFiles() == false) {
|
||||
diagram.clean();
|
||||
if (staticFilesMap != null) {
|
||||
staticFilesMap.clean();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private GraphvizMaker populateImagesAndCreateGraphvizMaker(List<String> dotStrings,
|
||||
FileFormatOption fileFormatOption) throws IOException, InterruptedException {
|
||||
populateImages(diagram.getDpiFactor(fileFormatOption), diagram.getDpi(fileFormatOption));
|
||||
populateImagesLink(diagram.getDpiFactor(fileFormatOption), diagram.getDpi(fileFormatOption));
|
||||
populateImages(fileFormatOption);
|
||||
populateImagesLink(fileFormatOption);
|
||||
final GraphvizMaker dotMaker = createDotMaker(dotStrings, fileFormatOption);
|
||||
return dotMaker;
|
||||
}
|
||||
@ -1087,7 +1003,7 @@ public final class CucaDiagramFileMaker {
|
||||
new CucaDiagramSimplifier(diagram, dotStrings, fileFormat);
|
||||
}
|
||||
final DotData dotData = new DotData(null, diagram.getLinks(), diagram.entities(), diagram.getUmlDiagramType(),
|
||||
diagram.getSkinParam(), diagram.getRankdir(), diagram, diagram);
|
||||
diagram.getSkinParam(), diagram.getRankdir(), diagram, diagram, diagram.getColorMapper());
|
||||
|
||||
dotData.setDpi(diagram.getDpi(fileFormatOption));
|
||||
|
||||
@ -1106,22 +1022,22 @@ public final class CucaDiagramFileMaker {
|
||||
// return new DotMaker(dotData, dotStrings, fileFormat);
|
||||
}
|
||||
|
||||
private void populateImages(double dpiFactor, int dpi) throws IOException {
|
||||
private void populateImages(FileFormatOption option) throws IOException {
|
||||
for (Entity entity : diagram.entities().values()) {
|
||||
final DrawFile f = createImage(entity, dpiFactor, dpi);
|
||||
final DrawFile f = createImage(entity, option);
|
||||
if (f != null) {
|
||||
entity.setImageFile(f);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void populateImagesLink(double dpiFactor, int dpi) throws IOException {
|
||||
private void populateImagesLink(FileFormatOption option) throws IOException {
|
||||
for (Link link : diagram.getLinks()) {
|
||||
final String note = link.getNote();
|
||||
final List<? extends CharSequence> note = link.getNote();
|
||||
if (note == null) {
|
||||
continue;
|
||||
}
|
||||
final DrawFile f = createImageForNote(note, null, dpiFactor, dpi);
|
||||
final DrawFile f = createImageForNote(note, null, option, null);
|
||||
if (f != null) {
|
||||
link.setImageFile(f);
|
||||
}
|
||||
@ -1137,7 +1053,7 @@ public final class CucaDiagramFileMaker {
|
||||
sb.append(s);
|
||||
sb.append("\n");
|
||||
s = st.nextToken();
|
||||
if (s.equalsIgnoreCase("grestore") == false) {
|
||||
if (s.equalsIgnoreCase("grestore") == false && st.hasMoreTokens()) {
|
||||
s = st.nextToken();
|
||||
if (s.equalsIgnoreCase("grestore") == false) {
|
||||
throw new IllegalStateException();
|
||||
|
@ -37,6 +37,7 @@ import java.awt.Color;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.geom.Dimension2D;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
@ -69,7 +70,7 @@ public final class CucaDiagramFileMakerBeta {
|
||||
InterruptedException {
|
||||
OutputStream os = null;
|
||||
try {
|
||||
os = new FileOutputStream(suggested);
|
||||
os = new BufferedOutputStream(new FileOutputStream(suggested));
|
||||
createFile(os, dotStrings, fileFormat);
|
||||
} finally {
|
||||
if (os != null) {
|
||||
@ -105,11 +106,11 @@ public final class CucaDiagramFileMakerBeta {
|
||||
|
||||
private void createPng(OutputStream os, List<String> dotStrings) throws IOException, InterruptedException {
|
||||
|
||||
final Color background = diagram.getSkinParam().getBackgroundColor().getColor();
|
||||
final Color background = diagram.getColorMapper().getMappedColor(diagram.getSkinParam().getBackgroundColor());
|
||||
EmptyImageBuilder builder = new EmptyImageBuilder(10, 10, background);
|
||||
BufferedImage im = builder.getBufferedImage();
|
||||
Graphics2D g2d = builder.getGraphics2D();
|
||||
UGraphicG2d ug = new UGraphicG2d(g2d, im, 1.0);
|
||||
UGraphicG2d ug = new UGraphicG2d(diagram.getColorMapper(), g2d, im, 1.0);
|
||||
final PlayField playField = new PlayField(diagram.getSkinParam());
|
||||
|
||||
final Collection<IEntity> entities = getFirstLevelEntities();
|
||||
@ -126,7 +127,7 @@ public final class CucaDiagramFileMakerBeta {
|
||||
im = builder.getBufferedImage();
|
||||
g2d = builder.getGraphics2D();
|
||||
g2d.translate(10, 0);
|
||||
ug = new UGraphicG2d(g2d, im, 1.0);
|
||||
ug = new UGraphicG2d(diagram.getColorMapper(), g2d, im, 1.0);
|
||||
|
||||
playField.drawInternal(ug);
|
||||
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 5872 $
|
||||
* Revision $Revision: 6710 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.cucadiagram.dot;
|
||||
@ -37,6 +37,7 @@ import java.awt.Color;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.geom.AffineTransform;
|
||||
import java.awt.geom.Dimension2D;
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
@ -169,7 +170,7 @@ public final class CucaDiagramPngMaker2 {
|
||||
public List<File> createPng(File pngFile) throws IOException {
|
||||
OutputStream os = null;
|
||||
try {
|
||||
os = new FileOutputStream(pngFile);
|
||||
os = new BufferedOutputStream(new FileOutputStream(pngFile));
|
||||
createPng(os);
|
||||
} finally {
|
||||
if (os != null) {
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 5872 $
|
||||
* Revision $Revision: 6710 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.cucadiagram.dot;
|
||||
@ -37,6 +37,7 @@ import java.awt.Color;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.geom.AffineTransform;
|
||||
import java.awt.geom.Dimension2D;
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
@ -148,7 +149,7 @@ public final class CucaDiagramPngMaker3 {
|
||||
public List<File> createPng(File pngFile) throws IOException {
|
||||
OutputStream os = null;
|
||||
try {
|
||||
os = new FileOutputStream(pngFile);
|
||||
os = new BufferedOutputStream(new FileOutputStream(pngFile));
|
||||
createPng(os);
|
||||
} finally {
|
||||
if (os != null) {
|
||||
|
@ -28,15 +28,17 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 6169 $
|
||||
* Revision $Revision: 6710 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.cucadiagram.dot;
|
||||
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
@ -83,7 +85,8 @@ public final class CucaDiagramSimplifier {
|
||||
} else {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
final Entity proxy = new Entity("#" + g.getCode(), g.getDisplay(), type, g.getParent(), diagram.getHides());
|
||||
final Entity proxy = new Entity("#" + g.getCode(), g.getDisplay(), type, g.getParent(),
|
||||
diagram.getHides());
|
||||
if (type == EntityType.STATE) {
|
||||
manageBackColorForState(diagram, g, proxy);
|
||||
}
|
||||
@ -92,6 +95,17 @@ public final class CucaDiagramSimplifier {
|
||||
}
|
||||
computeImageGroup(g, proxy, dotStrings);
|
||||
diagram.overideGroup(g, proxy);
|
||||
if (proxy.getImageFile() != null) {
|
||||
diagram.ensureDelete(proxy.getImageFile());
|
||||
}
|
||||
|
||||
// final IEntity entityCluster = g.getEntityCluster();
|
||||
// if (entityCluster != null && entityCluster.getImageFile() != null) {
|
||||
// proxy.addSubImage(entityCluster.getImageFile());
|
||||
// }
|
||||
// if (entityCluster != null) {
|
||||
// proxy.addSubImage((Entity) entityCluster);
|
||||
// }
|
||||
|
||||
for (IEntity sub : g.entities().values()) {
|
||||
final DrawFile subImage = sub.getImageFile();
|
||||
@ -106,12 +120,37 @@ public final class CucaDiagramSimplifier {
|
||||
} while (changed);
|
||||
}
|
||||
|
||||
private void computeImageGroup(final Group group, final Entity entity, List<String> dotStrings) throws IOException,
|
||||
FileNotFoundException, InterruptedException {
|
||||
if (group.entities().size()==0) {
|
||||
return;
|
||||
}
|
||||
final GroupPngMaker maker = new GroupPngMaker(diagram, group, fileFormat);
|
||||
final File f = FileUtils.createTempFile("inner", ".png");
|
||||
OutputStream fos = null;
|
||||
try {
|
||||
fos = new BufferedOutputStream(new FileOutputStream(f));
|
||||
maker.createPng(fos, dotStrings);
|
||||
final String svg = maker.createSvg(dotStrings);
|
||||
// final Pattern pImage = Pattern.compile("(?i)<image\\W[^>]*>");
|
||||
// final Matcher mImage = pImage.matcher(svg);
|
||||
// if (mImage.find()) {
|
||||
// throw new IllegalStateException();
|
||||
// }
|
||||
entity.setImageFile(DrawFile.createFromFile(f, svg, null));
|
||||
} finally {
|
||||
if (fos != null) {
|
||||
fos.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void manageBackColorForState(CucaDiagram diagram, Group g, final Entity proxy) {
|
||||
if (OptionFlags.PBBACK == false) {
|
||||
return;
|
||||
}
|
||||
if (g.getBackColor() != null) {
|
||||
proxy.setSpecificBackcolor(g.getBackColor().getAsHtml());
|
||||
proxy.setSpecificBackcolor(g.getBackColor());
|
||||
return;
|
||||
}
|
||||
assert g.getBackColor() == null;
|
||||
@ -129,26 +168,4 @@ public final class CucaDiagramSimplifier {
|
||||
g.setBackColor(back);
|
||||
}
|
||||
|
||||
private void computeImageGroup(final Group group, final Entity entity, List<String> dotStrings) throws IOException,
|
||||
FileNotFoundException, InterruptedException {
|
||||
final GroupPngMaker maker = new GroupPngMaker(diagram, group, fileFormat);
|
||||
final File f = FileUtils.createTempFile("inner", ".png");
|
||||
FileOutputStream fos = null;
|
||||
try {
|
||||
fos = new FileOutputStream(f);
|
||||
maker.createPng(fos, dotStrings);
|
||||
final String svg = maker.createSvg(dotStrings);
|
||||
// final Pattern pImage = Pattern.compile("(?i)<image\\W[^>]*>");
|
||||
// final Matcher mImage = pImage.matcher(svg);
|
||||
// if (mImage.find()) {
|
||||
// throw new IllegalStateException();
|
||||
// }
|
||||
entity.setImageFile(DrawFile.createFromFile(f, svg, null));
|
||||
} finally {
|
||||
if (fos != null) {
|
||||
fos.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,115 @@
|
||||
/* ========================================================================
|
||||
* 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: 6710 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.cucadiagram.dot;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
import net.sourceforge.plantuml.cucadiagram.CucaDiagram;
|
||||
import net.sourceforge.plantuml.cucadiagram.Entity;
|
||||
import net.sourceforge.plantuml.cucadiagram.EntityType;
|
||||
import net.sourceforge.plantuml.cucadiagram.Group;
|
||||
import net.sourceforge.plantuml.cucadiagram.GroupType;
|
||||
import net.sourceforge.plantuml.cucadiagram.IEntity;
|
||||
import net.sourceforge.plantuml.cucadiagram.Member;
|
||||
import net.sourceforge.plantuml.svek.GroupPngMaker2;
|
||||
|
||||
public final class CucaDiagramSimplifier2 {
|
||||
|
||||
private final CucaDiagram diagram;
|
||||
|
||||
public CucaDiagramSimplifier2(CucaDiagram diagram, List<String> dotStrings) throws IOException, InterruptedException {
|
||||
this.diagram = diagram;
|
||||
boolean changed;
|
||||
do {
|
||||
changed = false;
|
||||
final Collection<Group> groups = new ArrayList<Group>(diagram.getGroups());
|
||||
for (Group g : groups) {
|
||||
if (diagram.isAutarkic(g)) {
|
||||
final EntityType type;
|
||||
if (g.getType() == GroupType.CONCURRENT_STATE) {
|
||||
type = EntityType.STATE_CONCURRENT;
|
||||
} else if (g.getType() == GroupType.STATE) {
|
||||
type = EntityType.STATE;
|
||||
} else if (g.getType() == GroupType.INNER_ACTIVITY) {
|
||||
type = EntityType.ACTIVITY;
|
||||
} else if (g.getType() == GroupType.CONCURRENT_ACTIVITY) {
|
||||
type = EntityType.ACTIVITY_CONCURRENT;
|
||||
} else {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
final Entity proxy = new Entity("#" + g.getCode(), g.getDisplay(), type, g.getParent(), diagram
|
||||
.getHides());
|
||||
// if (type == EntityType.STATE) {
|
||||
// manageBackColorForState(diagram, g, proxy);
|
||||
// }
|
||||
for (Member field : g.getEntityCluster().getFieldsToDisplay()) {
|
||||
proxy.addField(field);
|
||||
}
|
||||
computeImageGroup(g, proxy, dotStrings);
|
||||
diagram.overideGroup(g, proxy);
|
||||
if (proxy.getImageFile() != null) {
|
||||
diagram.ensureDelete(proxy.getImageFile());
|
||||
}
|
||||
|
||||
// final IEntity entityCluster = g.getEntityCluster();
|
||||
// if (entityCluster != null && entityCluster.getImageFile()
|
||||
// != null) {
|
||||
// proxy.addSubImage(entityCluster.getImageFile());
|
||||
// }
|
||||
// if (entityCluster != null) {
|
||||
// proxy.addSubImage((Entity) entityCluster);
|
||||
// }
|
||||
|
||||
for (IEntity sub : g.entities().values()) {
|
||||
final DrawFile subImage = sub.getImageFile();
|
||||
if (subImage != null) {
|
||||
proxy.addSubImage(subImage);
|
||||
}
|
||||
}
|
||||
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
} while (changed);
|
||||
}
|
||||
|
||||
private void computeImageGroup(Group g, Entity proxy, List<String> dotStrings) throws IOException, InterruptedException {
|
||||
final GroupPngMaker2 maker = new GroupPngMaker2(diagram, g);
|
||||
proxy.setSvekImage(maker.getImage());
|
||||
}
|
||||
|
||||
}
|
@ -122,7 +122,7 @@ public final class CucaDiagramTxtMaker {
|
||||
final int w = getWidth(ent);
|
||||
final int h = getHeight(ent);
|
||||
ug.getCharArea().drawBoxSimple(0, 0, w, h);
|
||||
ug.getCharArea().drawStringsLR(StringUtils.getWithNewlines(ent.getDisplay()), 1, 1);
|
||||
ug.getCharArea().drawStringsLR(ent.getDisplay2(), 1, 1);
|
||||
int y = 2;
|
||||
ug.getCharArea().drawHLine('-', y, 1, w - 1);
|
||||
y++;
|
||||
@ -150,7 +150,7 @@ public final class CucaDiagramTxtMaker {
|
||||
}
|
||||
|
||||
private int getHeight(Entity entity) {
|
||||
int result = StringUtils.getHeight(StringUtils.getWithNewlines(entity.getDisplay()));
|
||||
int result = StringUtils.getHeight(entity.getDisplay2());
|
||||
for (Member att : entity.getMethodsToDisplay()) {
|
||||
result += StringUtils.getHeight(StringUtils.getWithNewlines(att.getDisplayWithVisibilityChar()));
|
||||
}
|
||||
@ -161,7 +161,7 @@ public final class CucaDiagramTxtMaker {
|
||||
}
|
||||
|
||||
private int getWidth(Entity entity) {
|
||||
int result = StringUtils.getWidth(StringUtils.getWithNewlines(entity.getDisplay()));
|
||||
int result = StringUtils.getWidth(entity.getDisplay2());
|
||||
for (Member att : entity.getMethodsToDisplay()) {
|
||||
final int w = StringUtils.getWidth(StringUtils.getWithNewlines(att.getDisplayWithVisibilityChar()));
|
||||
if (w > result) {
|
||||
|
@ -43,6 +43,7 @@ import javax.imageio.ImageIO;
|
||||
import net.sourceforge.plantuml.ColorParam;
|
||||
import net.sourceforge.plantuml.FileFormat;
|
||||
import net.sourceforge.plantuml.FontParam;
|
||||
import net.sourceforge.plantuml.StringUtils;
|
||||
import net.sourceforge.plantuml.cucadiagram.EntityPortion;
|
||||
import net.sourceforge.plantuml.cucadiagram.EntityType;
|
||||
import net.sourceforge.plantuml.cucadiagram.Group;
|
||||
@ -51,6 +52,7 @@ import net.sourceforge.plantuml.cucadiagram.Member;
|
||||
import net.sourceforge.plantuml.cucadiagram.Stereotype;
|
||||
import net.sourceforge.plantuml.graphic.HtmlColor;
|
||||
import net.sourceforge.plantuml.skin.rose.Rose;
|
||||
import net.sourceforge.plantuml.ugraphic.ColorMapper;
|
||||
|
||||
abstract class DotCommon {
|
||||
|
||||
@ -60,8 +62,6 @@ abstract class DotCommon {
|
||||
|
||||
private final Rose rose = new Rose();
|
||||
|
||||
|
||||
|
||||
DotCommon(FileFormat fileFormat, DotData data) {
|
||||
this.fileFormat = fileFormat;
|
||||
this.data = data;
|
||||
@ -74,6 +74,10 @@ abstract class DotCommon {
|
||||
return entity.getStereotype();
|
||||
}
|
||||
|
||||
protected final ColorMapper getColorMapper() {
|
||||
return data.getColorMapper();
|
||||
}
|
||||
|
||||
protected final boolean isThereLabel(final Stereotype stereotype) {
|
||||
return stereotype != null && stereotype.getLabel() != null;
|
||||
}
|
||||
@ -87,11 +91,12 @@ abstract class DotCommon {
|
||||
final String stereo = entity.getStereotype() == null ? null : entity.getStereotype().getLabel();
|
||||
if (isThereLabel(stereotype)) {
|
||||
sb.append("<BR ALIGN=\"LEFT\"/>");
|
||||
sb.append(manageHtmlIB(stereotype.getLabel(), classes ? FontParam.CLASS_STEREOTYPE
|
||||
: FontParam.OBJECT_STEREOTYPE, stereo));
|
||||
for (String st : stereotype.getLabels()) {
|
||||
sb.append(manageHtmlIB(st, classes ? FontParam.CLASS_STEREOTYPE : FontParam.OBJECT_STEREOTYPE, stereo));
|
||||
sb.append("<BR/>");
|
||||
}
|
||||
String display = entity.getDisplay();
|
||||
}
|
||||
String display = StringUtils.getMergedLines(entity.getDisplay2());
|
||||
final boolean italic = entity.getType() == EntityType.ABSTRACT_CLASS
|
||||
|| entity.getType() == EntityType.INTERFACE;
|
||||
if (italic) {
|
||||
@ -102,11 +107,11 @@ abstract class DotCommon {
|
||||
|
||||
protected final String manageHtmlIB(String s, FontParam param, String stereotype) {
|
||||
s = unicode(s);
|
||||
final int fontSize = data.getSkinParam().getFontSize(param, stereotype);
|
||||
final int style = data.getSkinParam().getFontStyle(param, stereotype);
|
||||
final String fontFamily = data.getSkinParam().getFontFamily(param, stereotype);
|
||||
final DotExpression dotExpression = new DotExpression(s, fontSize, getFontHtmlColor(param, stereotype),
|
||||
fontFamily, style, fileFormat);
|
||||
final int fontSize = data.getSkinParam().getFont(param, stereotype).getSize();
|
||||
final int style = data.getSkinParam().getFont(param, stereotype).getStyle();
|
||||
final String fontFamily = data.getSkinParam().getFont(param, stereotype).getFamily(null);
|
||||
final DotExpression dotExpression = new DotExpression(getColorMapper(), s, fontSize, getFontHtmlColor(param,
|
||||
stereotype), fontFamily, style, fileFormat);
|
||||
final String result = dotExpression.getDotHtml();
|
||||
if (dotExpression.isUnderline()) {
|
||||
underline = true;
|
||||
@ -121,7 +126,8 @@ abstract class DotCommon {
|
||||
static String unicode(String s) {
|
||||
final StringBuilder result = new StringBuilder();
|
||||
for (char c : s.toCharArray()) {
|
||||
if (c > 127 || c == '&') {
|
||||
if (c > 127 || c == '&' || c == '|') {
|
||||
// if (c > 127 || c == '&') {
|
||||
final int i = c;
|
||||
result.append("&#" + i + ";");
|
||||
} else {
|
||||
@ -216,7 +222,7 @@ abstract class DotCommon {
|
||||
}
|
||||
|
||||
protected final int getLonguestHeader(IEntity entity) {
|
||||
int result = entity.getDisplay().length();
|
||||
int result = StringUtils.getMergedLines(entity.getDisplay2()).length();
|
||||
final Stereotype stereotype = getStereotype(entity);
|
||||
if (isThereLabel(stereotype)) {
|
||||
final int size = stereotype.getLabel().length();
|
||||
@ -228,7 +234,11 @@ abstract class DotCommon {
|
||||
}
|
||||
|
||||
protected final String getColorString(ColorParam colorParam, String stereotype) {
|
||||
return "\"" + rose.getHtmlColor(getData().getSkinParam(), colorParam, stereotype).getAsHtml() + "\"";
|
||||
return "\"" + getAsHtml(rose.getHtmlColor(getData().getSkinParam(), colorParam, stereotype)) + "\"";
|
||||
}
|
||||
|
||||
protected final String getAsHtml(HtmlColor htmlColor) {
|
||||
return StringUtils.getAsHtml(getColorMapper().getMappedColor(htmlColor));
|
||||
}
|
||||
|
||||
protected final int getLongestFieldOrAttribute(IEntity entity) {
|
||||
@ -275,7 +285,7 @@ abstract class DotCommon {
|
||||
if (parent.getBackColor() == null) {
|
||||
return null;
|
||||
}
|
||||
return "\"" + parent.getBackColor().getAsHtml() + "\"";
|
||||
return "\"" + getAsHtml(parent.getBackColor()) + "\"";
|
||||
}
|
||||
|
||||
final protected void appendImageAsTD(StringBuilder sb, String circleAbsolutePath) throws IOException {
|
||||
@ -294,8 +304,4 @@ abstract class DotCommon {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 6222 $
|
||||
* Revision $Revision: 6577 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.cucadiagram.dot;
|
||||
@ -53,6 +53,7 @@ import net.sourceforge.plantuml.cucadiagram.Link;
|
||||
import net.sourceforge.plantuml.cucadiagram.PortionShower;
|
||||
import net.sourceforge.plantuml.cucadiagram.Rankdir;
|
||||
import net.sourceforge.plantuml.skin.VisibilityModifier;
|
||||
import net.sourceforge.plantuml.ugraphic.ColorMapper;
|
||||
|
||||
final public class DotData implements PortionShower {
|
||||
|
||||
@ -68,11 +69,13 @@ final public class DotData implements PortionShower {
|
||||
|
||||
private StaticFilesMap staticFilesMap;
|
||||
private boolean visibilityModifierPresent;
|
||||
private final ColorMapper colorMapper;
|
||||
|
||||
public DotData(Group topParent, List<Link> links, Map<String, ? extends IEntity> entities,
|
||||
UmlDiagramType umlDiagramType, ISkinParam skinParam, Rankdir rankdir, GroupHierarchy groupHierarchy,
|
||||
PortionShower portionShower) {
|
||||
PortionShower portionShower, ColorMapper colorMapper) {
|
||||
this.topParent = topParent;
|
||||
this.colorMapper = colorMapper;
|
||||
this.links = links;
|
||||
this.entities = entities;
|
||||
this.umlDiagramType = umlDiagramType;
|
||||
@ -83,12 +86,13 @@ final public class DotData implements PortionShower {
|
||||
}
|
||||
|
||||
public DotData(Group topParent, List<Link> links, Map<String, ? extends IEntity> entities,
|
||||
UmlDiagramType umlDiagramType, ISkinParam skinParam, Rankdir rankdir, GroupHierarchy groupHierarchy) {
|
||||
UmlDiagramType umlDiagramType, ISkinParam skinParam, Rankdir rankdir, GroupHierarchy groupHierarchy,
|
||||
ColorMapper colorMapper) {
|
||||
this(topParent, links, entities, umlDiagramType, skinParam, rankdir, groupHierarchy, new PortionShower() {
|
||||
public boolean showPortion(EntityPortion portion, IEntity entity) {
|
||||
return true;
|
||||
}
|
||||
});
|
||||
}, colorMapper);
|
||||
}
|
||||
|
||||
public boolean hasUrl() {
|
||||
@ -116,8 +120,6 @@ final public class DotData implements PortionShower {
|
||||
this.visibilityModifierPresent = b;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void setStaticImagesMap(StaticFilesMap staticFilesMap) {
|
||||
checkObjectOrClassDiagram();
|
||||
this.staticFilesMap = staticFilesMap;
|
||||
@ -273,6 +275,8 @@ final public class DotData implements PortionShower {
|
||||
return hideEmptyDescription;
|
||||
}
|
||||
|
||||
|
||||
public final ColorMapper getColorMapper() {
|
||||
return colorMapper;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -28,12 +28,11 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 5705 $
|
||||
* Revision $Revision: 6932 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.cucadiagram.dot;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Font;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
@ -44,6 +43,7 @@ import java.util.List;
|
||||
import net.sourceforge.plantuml.FileFormat;
|
||||
import net.sourceforge.plantuml.FileSystem;
|
||||
import net.sourceforge.plantuml.Log;
|
||||
import net.sourceforge.plantuml.StringUtils;
|
||||
import net.sourceforge.plantuml.graphic.FontChange;
|
||||
import net.sourceforge.plantuml.graphic.FontConfiguration;
|
||||
import net.sourceforge.plantuml.graphic.FontStyle;
|
||||
@ -52,12 +52,14 @@ import net.sourceforge.plantuml.graphic.HtmlCommand;
|
||||
import net.sourceforge.plantuml.graphic.Img;
|
||||
import net.sourceforge.plantuml.graphic.Splitter;
|
||||
import net.sourceforge.plantuml.graphic.Text;
|
||||
import net.sourceforge.plantuml.ugraphic.ColorMapper;
|
||||
import net.sourceforge.plantuml.ugraphic.UFont;
|
||||
|
||||
final class DotExpression {
|
||||
public final class DotExpression {
|
||||
|
||||
private final StringBuilder sb = new StringBuilder();
|
||||
|
||||
private final Font normalFont;
|
||||
private final UFont normalFont;
|
||||
|
||||
private FontConfiguration fontConfiguration;
|
||||
|
||||
@ -67,15 +69,19 @@ final class DotExpression {
|
||||
|
||||
private final FileFormat fileFormat;
|
||||
|
||||
private final ColorMapper colorMapper;
|
||||
|
||||
private boolean hasImg;
|
||||
|
||||
DotExpression(String html, int defaultFontSize, HtmlColor color, String fontFamily, int style, FileFormat fileFormat) {
|
||||
public DotExpression(ColorMapper colorMapper, String html, int defaultFontSize, HtmlColor color, String fontFamily,
|
||||
int style, FileFormat fileFormat) {
|
||||
if (html.contains("\n")) {
|
||||
throw new IllegalArgumentException(html);
|
||||
}
|
||||
this.colorMapper = colorMapper;
|
||||
this.fontFamily = fontFamily;
|
||||
this.normalFont = new Font("SansSerif", Font.PLAIN, defaultFontSize);
|
||||
this.fontConfiguration = new FontConfiguration(normalFont, color.getColor());
|
||||
this.normalFont = new UFont("SansSerif", Font.PLAIN, defaultFontSize);
|
||||
this.fontConfiguration = new FontConfiguration(normalFont, color);
|
||||
this.fileFormat = fileFormat;
|
||||
|
||||
if ((style & Font.ITALIC) != 0) {
|
||||
@ -190,8 +196,8 @@ final class DotExpression {
|
||||
sb.append("\" ");
|
||||
appendFontWithFamily(sb);
|
||||
|
||||
final Color col = fontConfiguration.getColor();
|
||||
sb.append(" COLOR=\"").append(HtmlColor.getAsHtml(col)).append("\"");
|
||||
final HtmlColor col = fontConfiguration.getColor();
|
||||
sb.append(" COLOR=\"").append(StringUtils.getAsHtml(colorMapper.getMappedColor(col))).append("\"");
|
||||
sb.append(">");
|
||||
return sb.toString();
|
||||
}
|
||||
|
@ -28,20 +28,21 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 6482 $
|
||||
* Revision $Revision: 6939 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.cucadiagram.dot;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Font;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import net.sourceforge.plantuml.ColorParam;
|
||||
@ -54,6 +55,7 @@ import net.sourceforge.plantuml.SignatureUtils;
|
||||
import net.sourceforge.plantuml.StringUtils;
|
||||
import net.sourceforge.plantuml.UmlDiagramType;
|
||||
import net.sourceforge.plantuml.Url;
|
||||
import net.sourceforge.plantuml.command.Position;
|
||||
import net.sourceforge.plantuml.cucadiagram.Entity;
|
||||
import net.sourceforge.plantuml.cucadiagram.EntityType;
|
||||
import net.sourceforge.plantuml.cucadiagram.Group;
|
||||
@ -70,6 +72,7 @@ import net.sourceforge.plantuml.graphic.HtmlColor;
|
||||
import net.sourceforge.plantuml.graphic.TextBlock;
|
||||
import net.sourceforge.plantuml.graphic.TextBlockUtils;
|
||||
import net.sourceforge.plantuml.skin.UDrawable;
|
||||
import net.sourceforge.plantuml.ugraphic.UFont;
|
||||
import net.sourceforge.plantuml.ugraphic.UGraphic;
|
||||
import net.sourceforge.plantuml.ugraphic.eps.UGraphicEps;
|
||||
|
||||
@ -88,6 +91,8 @@ final public class DotMaker extends DotCommon implements GraphvizMaker {
|
||||
// http://www.graphviz.org/bugs/b2114.html
|
||||
private static final boolean TURN_AROUND_B2114 = false;
|
||||
|
||||
private static final boolean NOLABEL = false;
|
||||
|
||||
private final Set<String> hasAlreadyOneIncommingArrowLenghtOne;
|
||||
|
||||
final private Set<String> rankMin = new HashSet<String>();
|
||||
@ -148,7 +153,7 @@ final public class DotMaker extends DotCommon implements GraphvizMaker {
|
||||
for (String s : dotStrings) {
|
||||
sb.append(s);
|
||||
}
|
||||
sb.append("bgcolor=\"" + getData().getSkinParam().getBackgroundColor().getAsHtml() + "\";");
|
||||
sb.append("bgcolor=\"" + getAsHtml(getData().getSkinParam().getBackgroundColor()) + "\";");
|
||||
if (huge) {
|
||||
sb.append("size=\"400,400;\"");
|
||||
} else {
|
||||
@ -200,8 +205,8 @@ final public class DotMaker extends DotCommon implements GraphvizMaker {
|
||||
private void printGroups(StringBuilder sb, Group parent) throws IOException {
|
||||
for (Group g : getData().getGroupHierarchy().getChildrenGroups(parent)) {
|
||||
if (getData().isEmpty(g) && g.getType() == GroupType.PACKAGE) {
|
||||
final IEntity folder = new Entity(g.getUid(), g.getCode(), g.getDisplay(), EntityType.EMPTY_PACKAGE,
|
||||
null, null);
|
||||
final IEntity folder = new Entity(g.getUid1(), g.getUid2(), g.getCode(), g.getDisplay(),
|
||||
EntityType.EMPTY_PACKAGE, null, null);
|
||||
printEntity(sb, folder);
|
||||
} else {
|
||||
printGroup(sb, g);
|
||||
@ -228,8 +233,9 @@ final public class DotMaker extends DotCommon implements GraphvizMaker {
|
||||
sb.append("subgraph " + g.getUid() + " {");
|
||||
// sb.append("margin=10;");
|
||||
|
||||
sb.append("fontsize=\"" + getData().getSkinParam().getFontSize(getFontParamForGroup(), stereo) + "\";");
|
||||
final String fontFamily = getData().getSkinParam().getFontFamily(getFontParamForGroup(), stereo);
|
||||
final UFont font = getData().getSkinParam().getFont(getFontParamForGroup(), stereo);
|
||||
sb.append("fontsize=\"" + font.getSize() + "\";");
|
||||
final String fontFamily = font.getFamily(null);
|
||||
if (fontFamily != null) {
|
||||
sb.append("fontname=\"" + fontFamily + "\";");
|
||||
}
|
||||
@ -237,11 +243,11 @@ final public class DotMaker extends DotCommon implements GraphvizMaker {
|
||||
if (g.getDisplay() != null) {
|
||||
sb.append("label=<" + manageHtmlIB(g.getDisplay(), getFontParamForGroup(), stereo) + ">;");
|
||||
}
|
||||
final String fontColor = getData().getSkinParam().getFontHtmlColor(getFontParamForGroup(), stereo).getAsHtml();
|
||||
final String fontColor = getAsHtml(getData().getSkinParam().getFontHtmlColor(getFontParamForGroup(), stereo));
|
||||
sb.append("fontcolor=\"" + fontColor + "\";");
|
||||
|
||||
if (getGroupBackColor(g) != null) {
|
||||
sb.append("fillcolor=\"" + getGroupBackColor(g).getAsHtml() + "\";");
|
||||
sb.append("fillcolor=\"" + getAsHtml(getGroupBackColor(g)) + "\";");
|
||||
}
|
||||
|
||||
if (g.getType() == GroupType.STATE) {
|
||||
@ -344,8 +350,9 @@ final public class DotMaker extends DotCommon implements GraphvizMaker {
|
||||
}
|
||||
// sb.append(g.getUid() + "min->" + g.getUid() + "max;");
|
||||
|
||||
sb.append("fontsize=\"" + getData().getSkinParam().getFontSize(getFontParamForGroup(), null) + "\";");
|
||||
final String fontFamily = getData().getSkinParam().getFontFamily(getFontParamForGroup(), null);
|
||||
final UFont font = getData().getSkinParam().getFont(getFontParamForGroup(), null);
|
||||
sb.append("fontsize=\"" + font.getSize() + "\";");
|
||||
final String fontFamily = font.getFamily(null);
|
||||
if (fontFamily != null) {
|
||||
sb.append("fontname=\"" + fontFamily + "\";");
|
||||
}
|
||||
@ -363,11 +370,11 @@ final public class DotMaker extends DotCommon implements GraphvizMaker {
|
||||
sb.append("label=<" + label + ">;");
|
||||
}
|
||||
|
||||
final String fontColor = getData().getSkinParam().getFontHtmlColor(getFontParamForGroup(), null).getAsHtml();
|
||||
final String fontColor = getAsHtml(getData().getSkinParam().getFontHtmlColor(getFontParamForGroup(), null));
|
||||
sb.append("fontcolor=\"" + fontColor + "\";");
|
||||
final HtmlColor groupBackColor = getGroupBackColor(g);
|
||||
if (groupBackColor != null) {
|
||||
sb.append("fillcolor=\"" + groupBackColor.getAsHtml() + "\";");
|
||||
sb.append("fillcolor=\"" + getAsHtml(groupBackColor) + "\";");
|
||||
}
|
||||
if (g.getType() == GroupType.STATE) {
|
||||
sb.append("color=" + getColorString(ColorParam.stateBorder, null) + ";");
|
||||
@ -537,12 +544,16 @@ final public class DotMaker extends DotCommon implements GraphvizMaker {
|
||||
|
||||
boolean hasLabel = false;
|
||||
|
||||
if (link.getLabel() != null) {
|
||||
if (link.getLabel() != null && noteLink != null) {
|
||||
decoration.append("label=<"
|
||||
+ getHtmlForLinkNote(noteLink.getPngOrEps(fileFormat), manageHtmlIB(link.getLabel(),
|
||||
getArrowFontParam(), null), link.getNotePosition()) + ">,");
|
||||
hasLabel = true;
|
||||
} else if (link.getLabel() != null) {
|
||||
decoration.append("label=<" + manageHtmlIB(link.getLabel(), getArrowFontParam(), null) + ">,");
|
||||
hasLabel = true;
|
||||
} else if (noteLink != null) {
|
||||
decoration
|
||||
.append("label=<" + getHtmlForLinkNote(noteLink.getPngOrEps(fileFormat == FileFormat.EPS)) + ">,");
|
||||
decoration.append("label=<" + getHtmlForLinkNote(noteLink.getPngOrEps(fileFormat)) + ">,");
|
||||
hasLabel = true;
|
||||
}
|
||||
|
||||
@ -633,14 +644,15 @@ final public class DotMaker extends DotCommon implements GraphvizMaker {
|
||||
if (link.getSpecificColor() == null) {
|
||||
decoration.append(getColorString(getArrowColorParam(), null));
|
||||
} else {
|
||||
decoration.append("\"" + link.getSpecificColor().getAsHtml() + "\"");
|
||||
decoration.append("\"" + getAsHtml(link.getSpecificColor()) + "\"");
|
||||
}
|
||||
decoration.append(",");
|
||||
|
||||
decoration.append("fontcolor=" + getFontColorString(getArrowFontParam(), null) + ",");
|
||||
decoration.append("fontsize=\"" + getData().getSkinParam().getFontSize(getArrowFontParam(), null) + "\",");
|
||||
final UFont font = getData().getSkinParam().getFont(getArrowFontParam(), null);
|
||||
decoration.append("fontsize=\"" + font.getSize() + "\",");
|
||||
|
||||
final String fontName = getData().getSkinParam().getFontFamily(getArrowFontParam(), null);
|
||||
final String fontName = font.getFamily(null);
|
||||
if (fontName != null) {
|
||||
decoration.append("fontname=\"" + fontName + "\",");
|
||||
}
|
||||
@ -666,13 +678,41 @@ final public class DotMaker extends DotCommon implements GraphvizMaker {
|
||||
|
||||
private String getHtmlForLinkNote(File image) {
|
||||
final String circleInterfaceAbsolutePath = StringUtils.getPlateformDependentAbsolutePath(image);
|
||||
final StringBuilder sb = new StringBuilder("<TABLE BORDER=\"0\" CELLBORDER=\"0\" CELLSPACING=\"0\">");
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
sb.append("<TABLE BORDER=\"0\" CELLBORDER=\"0\" CELLSPACING=\"0\">");
|
||||
sb.append("<TR><TD><IMG SRC=\"" + circleInterfaceAbsolutePath + "\"/></TD></TR>");
|
||||
sb.append("</TABLE>");
|
||||
return sb.toString();
|
||||
|
||||
}
|
||||
|
||||
private String getHtmlForLinkNote(File image, String labelHtml, Position position) {
|
||||
final String imagePath = StringUtils.getPlateformDependentAbsolutePath(image);
|
||||
final StringBuilder sb = new StringBuilder();
|
||||
sb.append("<TABLE BORDER=\"0\" CELLBORDER=\"0\" CELLSPACING=\"1\" CELLPADDING=\"0\">");
|
||||
switch (position) {
|
||||
case TOP:
|
||||
sb.append("<TR><TD><IMG SRC=\"" + imagePath + "\"/></TD></TR>");
|
||||
sb.append("<TR><TD>" + labelHtml + "</TD></TR>");
|
||||
break;
|
||||
case RIGHT:
|
||||
sb.append("<TR><TD><IMG SRC=\"" + imagePath + "\"/></TD>");
|
||||
sb.append("<TD>" + labelHtml + "</TD></TR>");
|
||||
break;
|
||||
case LEFT:
|
||||
sb.append("<TR><TD>" + labelHtml + "</TD>");
|
||||
sb.append("<TD><IMG SRC=\"" + imagePath + "\"/></TD></TR>");
|
||||
break;
|
||||
default:
|
||||
sb.append("<TR><TD>" + labelHtml + "</TD></TR>");
|
||||
sb.append("<TR><TD><IMG SRC=\"" + imagePath + "\"/></TD></TR>");
|
||||
break;
|
||||
}
|
||||
sb.append("</TABLE>");
|
||||
return sb.toString();
|
||||
|
||||
}
|
||||
|
||||
private FontParam getArrowFontParam() {
|
||||
if (getData().getUmlDiagramType() == UmlDiagramType.CLASS) {
|
||||
return FontParam.CLASS_ARROW;
|
||||
@ -708,7 +748,7 @@ final public class DotMaker extends DotCommon implements GraphvizMaker {
|
||||
}
|
||||
|
||||
private String getFontColorString(FontParam fontParam, String stereotype) {
|
||||
return "\"" + getFontHtmlColor(fontParam, stereotype).getAsHtml() + "\"";
|
||||
return "\"" + getAsHtml(getFontHtmlColor(fontParam, stereotype)) + "\"";
|
||||
}
|
||||
|
||||
private void eventuallySameRank(StringBuilder sb, Group entityPackage, Link link) {
|
||||
@ -727,7 +767,62 @@ final public class DotMaker extends DotCommon implements GraphvizMaker {
|
||||
|
||||
private boolean MODE_LOLLIPOP_BETA = false;
|
||||
|
||||
private void printEntities(StringBuilder sb, Collection<? extends IEntity> entities) throws IOException {
|
||||
class EntityComparator implements Comparator<IEntity> {
|
||||
public int compare(IEntity e1, IEntity e2) {
|
||||
final int xpos1 = e1.getXposition();
|
||||
final int xpos2 = e2.getXposition();
|
||||
if (xpos1 < xpos2) {
|
||||
return -1;
|
||||
}
|
||||
if (xpos1 > xpos2) {
|
||||
return 1;
|
||||
}
|
||||
return e1.compareTo(e2);
|
||||
}
|
||||
}
|
||||
|
||||
class EntityComparator2 implements Comparator<IEntity> {
|
||||
private final Map<IEntity, Integer> map;
|
||||
|
||||
public EntityComparator2(Map<IEntity, Integer> map) {
|
||||
this.map = map;
|
||||
}
|
||||
|
||||
public int compare(IEntity e1, IEntity e2) {
|
||||
final Integer b1 = map.get(e1);
|
||||
final Integer b2 = map.get(e2);
|
||||
final int cmp = b1.compareTo(b2);
|
||||
if (cmp != 0) {
|
||||
return -cmp;
|
||||
}
|
||||
return e1.compareTo(e2);
|
||||
}
|
||||
}
|
||||
|
||||
private Map<IEntity, Integer> getMap(Collection<? extends IEntity> entities2) {
|
||||
final Map<IEntity, Integer> map = new HashMap<IEntity, Integer>();
|
||||
for (IEntity ent : entities2) {
|
||||
map.put(ent, Integer.valueOf(0));
|
||||
}
|
||||
for (Link link : getData().getLinks()) {
|
||||
if (link.isConstraint() == false) {
|
||||
map.put(link.getEntity2(), Integer.valueOf(1));
|
||||
} else if (link.getLength() == 1 && link.isInverted()) {
|
||||
// map.put(link.getEntity2(), true);
|
||||
map.put(link.getEntity1(), Integer.valueOf(1));
|
||||
}
|
||||
|
||||
}
|
||||
return map;
|
||||
}
|
||||
|
||||
private void printEntities(StringBuilder sb, Collection<? extends IEntity> entities2) throws IOException {
|
||||
final List<IEntity> entities = new ArrayList<IEntity>(entities2);
|
||||
// Collections.sort(entities, new EntityComparator());
|
||||
// if (getData().getUmlDiagramType() == UmlDiagramType.ACTIVITY) {
|
||||
Collections.sort(entities, new EntityComparator2(getMap(entities2)));
|
||||
// }
|
||||
// Collections.sort(entities);
|
||||
final Set<IEntity> lollipops = new HashSet<IEntity>();
|
||||
final Set<IEntity> lollipopsFriends = new HashSet<IEntity>();
|
||||
for (IEntity entity : entities) {
|
||||
@ -806,7 +901,8 @@ final public class DotMaker extends DotCommon implements GraphvizMaker {
|
||||
final String color1 = getColorString(ColorParam.classBackground, null);
|
||||
final String color2 = getColorString(ColorParam.classBorder, null);
|
||||
final String colorBack = getColorString(ColorParam.background, null);
|
||||
final String labelLo = manageHtmlIB(entity.getDisplay(), FontParam.CLASS_ATTRIBUTE, null);
|
||||
final String labelLo = manageHtmlIB(StringUtils.getMergedLines(entity.getDisplay2()),
|
||||
FontParam.CLASS_ATTRIBUTE, null);
|
||||
sb.append(entity.getUid() + " [fillcolor=" + color1 + ",color=" + color2 + ",style=\"filled\","
|
||||
+ "shape=circle,width=0.12,height=0.12,label=\"\"];");
|
||||
sb.append(entity.getUid() + " -> " + entity.getUid() + "[color=" + colorBack
|
||||
@ -818,11 +914,11 @@ final public class DotMaker extends DotCommon implements GraphvizMaker {
|
||||
}
|
||||
|
||||
static final boolean MODE_MARGIN = true;
|
||||
static public final boolean MODE_BRANCHE_CLUSTER = true;
|
||||
static public final boolean MODE_BRANCHE_CLUSTER = false;
|
||||
|
||||
private void printEntity(StringBuilder sb, IEntity entity) throws IOException {
|
||||
final EntityType type = entity.getType();
|
||||
final String label = getLabel(entity);
|
||||
final String label = NOLABEL ? "label=\"" + entity.getUid() + "\"" : getLabel(entity);
|
||||
if (type == EntityType.GROUP) {
|
||||
return;
|
||||
}
|
||||
@ -865,11 +961,10 @@ final public class DotMaker extends DotCommon implements GraphvizMaker {
|
||||
if (file == null) {
|
||||
throw new IllegalStateException("No file for NOTE");
|
||||
}
|
||||
if (file.getPngOrEps(fileFormat == FileFormat.EPS).exists() == false) {
|
||||
if (file.getPngOrEps(fileFormat).exists() == false) {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
final String absolutePath = StringUtils.getPlateformDependentAbsolutePath(file
|
||||
.getPngOrEps(fileFormat == FileFormat.EPS));
|
||||
final String absolutePath = StringUtils.getPlateformDependentAbsolutePath(file.getPngOrEps(fileFormat));
|
||||
sb.append(entity.getUid() + " [margin=0,pad=0," + label + ",shape=none,image=\"" + absolutePath + "\"");
|
||||
} else if (type == EntityType.ACTIVITY) {
|
||||
String shape = "octagon";
|
||||
@ -882,7 +977,9 @@ final public class DotMaker extends DotCommon implements GraphvizMaker {
|
||||
} else if (type == EntityType.BRANCH) {
|
||||
if (MODE_BRANCHE_CLUSTER) {
|
||||
sb.append("subgraph cluster" + entity.getUid() + "br {");
|
||||
sb.append("label=<" + manageHtmlIB(entity.getDisplay(), FontParam.ACTIVITY, null) + ">;");
|
||||
sb.append("label=<"
|
||||
+ manageHtmlIB(StringUtils.getMergedLines(entity.getDisplay2()), FontParam.ACTIVITY, null)
|
||||
+ ">;");
|
||||
sb.append("color=" + getColorString(ColorParam.background, null) + ";");
|
||||
}
|
||||
sb.append(entity.getUid() + " [fillcolor=" + getBackColorOfEntity(entity) + ",color="
|
||||
@ -896,6 +993,10 @@ final public class DotMaker extends DotCommon implements GraphvizMaker {
|
||||
// "[taillabel=\"" + entity.getDisplay()
|
||||
// + "\",arrowtail=none,arrowhead=none,color=\"white\"];");
|
||||
// }
|
||||
} else if (type == EntityType.ASSOCIATION) {
|
||||
sb.append(entity.getUid() + " [fillcolor=" + getColorString(ColorParam.classBackground, stereo) + ",color="
|
||||
+ getColorString(ColorParam.classBorder, stereo)
|
||||
+ ",style=\"filled\",shape=diamond,height=.25,width=.25,label=\"\"");
|
||||
} else if (type == EntityType.SYNCHRO_BAR) {
|
||||
final String color = getColorString(ColorParam.activityBar, null);
|
||||
sb.append(entity.getUid() + " [fillcolor=" + color + ",color=" + color + ",style=\"filled\","
|
||||
@ -908,6 +1009,9 @@ final public class DotMaker extends DotCommon implements GraphvizMaker {
|
||||
final String color = getColorString(getEndColorParam(), null);
|
||||
sb.append(entity.getUid() + " [fillcolor=" + color + ",color=" + color + ",style=\"filled\","
|
||||
+ "shape=doublecircle,width=.13,height=.13,label=\"\"");
|
||||
} else if (type == EntityType.PSEUDO_STATE) {
|
||||
final String color = getColorString(getStartColorParam(), null);
|
||||
sb.append(entity.getUid() + " [color=" + color + "," + "shape=circle,width=.01,height=.01," + label);
|
||||
} else if (type == EntityType.POINT_FOR_ASSOCIATION) {
|
||||
sb
|
||||
.append(entity.getUid() + " [width=.05,shape=point,color="
|
||||
@ -1023,7 +1127,7 @@ final public class DotMaker extends DotCommon implements GraphvizMaker {
|
||||
final DrawFile drawFile = entity.getImageFile();
|
||||
if (drawFile != null) {
|
||||
final String path = StringUtils.getPlateformDependentAbsolutePath(drawFile.getPng());
|
||||
final String bgcolor = "\"" + getData().getSkinParam().getBackgroundColor().getAsHtml() + "\"";
|
||||
final String bgcolor = "\"" + getAsHtml(getData().getSkinParam().getBackgroundColor()) + "\"";
|
||||
final StringBuilder sb = new StringBuilder("label=<");
|
||||
sb.append("<TABLE BORDER=\"0\" CELLBORDER=\"0\" CELLSPACING=\"0\" CELLPADDING=\"0\">");
|
||||
sb.append("<TR>");
|
||||
@ -1044,17 +1148,19 @@ final public class DotMaker extends DotCommon implements GraphvizMaker {
|
||||
return "label=" + getLabelForState(entity);
|
||||
} else if (entity.getType() == EntityType.BRANCH) {
|
||||
return "label=\"\"";
|
||||
} else if (entity.getType() == EntityType.PSEUDO_STATE) {
|
||||
return "label=\"H\"";
|
||||
}
|
||||
return "label=\"" + entity.getDisplay() + "\"";
|
||||
return "label=\"" + StringUtils.getMergedLines(entity.getDisplay2()) + "\"";
|
||||
}
|
||||
|
||||
private String getSimpleLabelAsHtml(IEntity entity, FontParam param, String stereotype) {
|
||||
return "<" + manageHtmlIB(entity.getDisplay(), param, stereotype) + ">";
|
||||
return "<" + manageHtmlIB(StringUtils.getMergedLines(entity.getDisplay2()), param, stereotype) + ">";
|
||||
}
|
||||
|
||||
private String getBackColorOfEntity(IEntity entity) {
|
||||
if (entity.getSpecificBackColor() != null) {
|
||||
return "\"" + entity.getSpecificBackColor().getAsHtml() + "\"";
|
||||
return "\"" + getAsHtml(entity.getSpecificBackColor()) + "\"";
|
||||
}
|
||||
final String stereo = entity.getStereotype() == null ? null : entity.getStereotype().getLabel();
|
||||
if (entity.getType() == EntityType.STATE || entity.getType() == EntityType.STATE_CONCURRENT) {
|
||||
@ -1075,7 +1181,9 @@ final public class DotMaker extends DotCommon implements GraphvizMaker {
|
||||
|
||||
final StringBuilder sb = new StringBuilder("<{<TABLE BGCOLOR=" + stateBgcolor
|
||||
+ " BORDER=\"0\" CELLBORDER=\"0\" CELLSPACING=\"0\">");
|
||||
sb.append("<TR><TD>" + manageHtmlIB(entity.getDisplay(), FontParam.STATE, stereotype) + "</TD></TR>");
|
||||
sb.append("<TR><TD>"
|
||||
+ manageHtmlIB(StringUtils.getMergedLines(entity.getDisplay2()), FontParam.STATE, stereotype)
|
||||
+ "</TD></TR>");
|
||||
sb.append("</TABLE>");
|
||||
|
||||
if (entity.getFieldsToDisplay().size() > 0) {
|
||||
@ -1093,7 +1201,7 @@ final public class DotMaker extends DotCommon implements GraphvizMaker {
|
||||
if (OptionFlags.PBBACK) {
|
||||
bgcolor = stateBgcolor;
|
||||
} else {
|
||||
bgcolor = "\"" + getData().getSkinParam().getBackgroundColor().getAsHtml() + "\"";
|
||||
bgcolor = "\"" + getAsHtml(getData().getSkinParam().getBackgroundColor()) + "\"";
|
||||
}
|
||||
// PBBACK
|
||||
|
||||
@ -1124,7 +1232,9 @@ final public class DotMaker extends DotCommon implements GraphvizMaker {
|
||||
sb.append("<TR><TD>" + manageHtmlIB(stereotype.getLabel(), FontParam.USECASE_STEREOTYPE, stereo)
|
||||
+ "</TD></TR>");
|
||||
}
|
||||
sb.append("<TR><TD>" + manageHtmlIB(entity.getDisplay(), FontParam.USECASE, stereo) + "</TD></TR>");
|
||||
sb.append("<TR><TD>"
|
||||
+ manageHtmlIB(StringUtils.getMergedLines(entity.getDisplay2()), FontParam.USECASE, stereo)
|
||||
+ "</TD></TR>");
|
||||
sb.append("</TABLE>>");
|
||||
return sb.toString();
|
||||
}
|
||||
@ -1140,7 +1250,9 @@ final public class DotMaker extends DotCommon implements GraphvizMaker {
|
||||
sb.append("<TR><TD>" + manageHtmlIB(stereotype.getLabel(), FontParam.COMPONENT_STEREOTYPE, stereo)
|
||||
+ "</TD></TR>");
|
||||
}
|
||||
sb.append("<TR><TD>" + manageHtmlIB(entity.getDisplay(), FontParam.COMPONENT, stereo) + "</TD></TR>");
|
||||
sb.append("<TR><TD>"
|
||||
+ manageHtmlIB(StringUtils.getMergedLines(entity.getDisplay2()), FontParam.COMPONENT, stereo)
|
||||
+ "</TD></TR>");
|
||||
sb.append("</TABLE>>");
|
||||
return sb.toString();
|
||||
}
|
||||
@ -1150,11 +1262,10 @@ final public class DotMaker extends DotCommon implements GraphvizMaker {
|
||||
if (file == null) {
|
||||
throw new IllegalStateException("No file for NOTE");
|
||||
}
|
||||
if (file.getPngOrEps(fileFormat == FileFormat.EPS).exists() == false) {
|
||||
if (file.getPngOrEps(fileFormat).exists() == false) {
|
||||
throw new IllegalStateException();
|
||||
}
|
||||
final String absolutePath = StringUtils.getPlateformDependentAbsolutePath(file
|
||||
.getPngOrEps(fileFormat == FileFormat.EPS));
|
||||
final String absolutePath = StringUtils.getPlateformDependentAbsolutePath(file.getPngOrEps(fileFormat));
|
||||
|
||||
final StringBuilder sb = new StringBuilder("<<TABLE BORDER=\"0\" CELLBORDER=\"0\" CELLSPACING=\"0\">");
|
||||
sb.append("<TR>");
|
||||
@ -1166,7 +1277,7 @@ final public class DotMaker extends DotCommon implements GraphvizMaker {
|
||||
|
||||
private String getLabelForActor(IEntity entity) throws IOException {
|
||||
final String actorAbsolutePath = StringUtils.getPlateformDependentAbsolutePath(entity.getImageFile()
|
||||
.getPngOrEps(fileFormat == FileFormat.EPS));
|
||||
.getPngOrEps(fileFormat));
|
||||
final Stereotype stereotype = getStereotype(entity);
|
||||
final String stereo = entity.getStereotype() == null ? null : entity.getStereotype().getLabel();
|
||||
|
||||
@ -1182,7 +1293,9 @@ final public class DotMaker extends DotCommon implements GraphvizMaker {
|
||||
addTdImageBugB1983(sb, actorAbsolutePath);
|
||||
sb.append("</TR>");
|
||||
}
|
||||
sb.append("<TR><TD>" + manageHtmlIB(entity.getDisplay(), FontParam.USECASE_ACTOR, stereo) + "</TD></TR>");
|
||||
sb.append("<TR><TD>"
|
||||
+ manageHtmlIB(StringUtils.getMergedLines(entity.getDisplay2()), FontParam.USECASE_ACTOR, stereo)
|
||||
+ "</TD></TR>");
|
||||
sb.append("</TABLE>>");
|
||||
return sb.toString();
|
||||
|
||||
@ -1190,7 +1303,7 @@ final public class DotMaker extends DotCommon implements GraphvizMaker {
|
||||
|
||||
private String getLabelForCircleInterface(IEntity entity) throws IOException {
|
||||
final String circleInterfaceAbsolutePath = StringUtils.getPlateformDependentAbsolutePath(entity.getImageFile()
|
||||
.getPngOrEps(fileFormat == FileFormat.EPS));
|
||||
.getPngOrEps(fileFormat));
|
||||
final Stereotype stereotype = getStereotype(entity);
|
||||
final String stereo = entity.getStereotype() == null ? null : entity.getStereotype().getLabel();
|
||||
|
||||
@ -1206,7 +1319,9 @@ final public class DotMaker extends DotCommon implements GraphvizMaker {
|
||||
addTdImageBugB1983(sb, circleInterfaceAbsolutePath);
|
||||
}
|
||||
sb.append("</TR>");
|
||||
sb.append("<TR><TD>" + manageHtmlIB(entity.getDisplay(), FontParam.COMPONENT, stereo) + "</TD></TR>");
|
||||
sb.append("<TR><TD>"
|
||||
+ manageHtmlIB(StringUtils.getMergedLines(entity.getDisplay2()), FontParam.COMPONENT, stereo)
|
||||
+ "</TD></TR>");
|
||||
sb.append("</TABLE>>");
|
||||
return sb.toString();
|
||||
|
||||
@ -1215,7 +1330,7 @@ final public class DotMaker extends DotCommon implements GraphvizMaker {
|
||||
private String getLabelForLollipop(IEntity entity) throws IOException {
|
||||
final String stereo = entity.getStereotype() == null ? null : entity.getStereotype().getLabel();
|
||||
final String circleInterfaceAbsolutePath = StringUtils.getPlateformDependentAbsolutePath(getData()
|
||||
.getStaticImages(EntityType.LOLLIPOP, stereo).getPngOrEps(fileFormat == FileFormat.EPS));
|
||||
.getStaticImages(EntityType.LOLLIPOP, stereo).getPngOrEps(fileFormat));
|
||||
final Stereotype stereotype = getStereotype(entity);
|
||||
|
||||
final StringBuilder sb = new StringBuilder("<<TABLE BORDER=\"0\" CELLBORDER=\"0\" CELLSPACING=\"0\">");
|
||||
@ -1229,7 +1344,8 @@ final public class DotMaker extends DotCommon implements GraphvizMaker {
|
||||
addTdImageBugB1983(sb, circleInterfaceAbsolutePath);
|
||||
}
|
||||
sb.append("</TR>");
|
||||
sb.append("<TR><TD>" + manageHtmlIB(entity.getDisplay(), FontParam.CLASS, null) + "</TD></TR>");
|
||||
sb.append("<TR><TD>" + manageHtmlIB(StringUtils.getMergedLines(entity.getDisplay2()), FontParam.CLASS, null)
|
||||
+ "</TD></TR>");
|
||||
sb.append("</TABLE>>");
|
||||
return sb.toString();
|
||||
|
||||
@ -1247,8 +1363,7 @@ final public class DotMaker extends DotCommon implements GraphvizMaker {
|
||||
LabelBuilder builder = new LabelBuilderClassOld(getFileFormat(), getData(), entity);
|
||||
if (MODE_LOLLIPOP_BETA) {
|
||||
final DrawFile cFile = getData().getStaticImages(entity.getType(), null);
|
||||
final String northPath = StringUtils.getPlateformDependentAbsolutePath(cFile
|
||||
.getPngOrEps(getFileFormat() == FileFormat.EPS));
|
||||
final String northPath = StringUtils.getPlateformDependentAbsolutePath(cFile.getPngOrEps(getFileFormat()));
|
||||
final String southPath = northPath;
|
||||
final String eastPath = northPath;
|
||||
final String westPath = northPath;
|
||||
@ -1281,12 +1396,12 @@ final public class DotMaker extends DotCommon implements GraphvizMaker {
|
||||
}
|
||||
texts.add(s);
|
||||
}
|
||||
final Font font = getData().getSkinParam().getFont(FontParam.CLASS_ATTRIBUTE, null);
|
||||
final Color color = getFontHtmlColor(FontParam.CLASS_ATTRIBUTE, null).getColor();
|
||||
final UFont font = getData().getSkinParam().getFont(FontParam.CLASS_ATTRIBUTE, null);
|
||||
final HtmlColor color = getFontHtmlColor(FontParam.CLASS_ATTRIBUTE, null);
|
||||
final TextBlock text = TextBlockUtils.create(texts, new FontConfiguration(font, color),
|
||||
HorizontalAlignement.LEFT);
|
||||
final File feps = FileUtils.createTempFile("member", ".eps");
|
||||
UGraphicEps.copyEpsToFile(new UDrawable() {
|
||||
UGraphicEps.copyEpsToFile(getData().getColorMapper(), new UDrawable() {
|
||||
public void drawU(UGraphic ug) {
|
||||
text.drawU(ug, 0, 0);
|
||||
}
|
||||
@ -1356,7 +1471,7 @@ final public class DotMaker extends DotCommon implements GraphvizMaker {
|
||||
return false;
|
||||
}
|
||||
|
||||
public static final String getLastDotSignature() {
|
||||
private static final String getLastDotSignature() {
|
||||
return lastDotSignature;
|
||||
}
|
||||
|
||||
@ -1377,4 +1492,8 @@ final public class DotMaker extends DotCommon implements GraphvizMaker {
|
||||
}
|
||||
}
|
||||
|
||||
public static final boolean isJunit() {
|
||||
return isJunit;
|
||||
}
|
||||
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -36,98 +36,212 @@ package net.sourceforge.plantuml.cucadiagram.dot;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
|
||||
import net.sourceforge.plantuml.FileUtils;
|
||||
import net.sourceforge.plantuml.FileFormat;
|
||||
import net.sourceforge.plantuml.Log;
|
||||
import net.sourceforge.plantuml.OptionFlags;
|
||||
|
||||
public class DrawFile {
|
||||
|
||||
private static final Map<Object, DrawFile> cache = new HashMap<Object, DrawFile>();
|
||||
private static final Collection<DrawFile> toDelete = new HashSet<DrawFile>();
|
||||
|
||||
private final LazyFile png2;
|
||||
private final LazyCached<String> svg2;
|
||||
private final LazyFile eps2;
|
||||
private final String toStringValue;
|
||||
private final boolean cached;
|
||||
|
||||
private final AtomicInteger useCounter = new AtomicInteger(0);
|
||||
private final AtomicInteger totalUse = new AtomicInteger(0);
|
||||
private final AtomicBoolean useable = new AtomicBoolean(true);
|
||||
|
||||
private int widthPng = -1;
|
||||
private int heightPng = -1;
|
||||
|
||||
static {
|
||||
addHook();
|
||||
}
|
||||
|
||||
public static boolean isCacheClean() {
|
||||
synchronized (toDelete) {
|
||||
for (DrawFile f : toDelete) {
|
||||
if (f.useCounter.get() != 0) {
|
||||
Log.error("Remaining " + f);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
for (DrawFile f : cache.values()) {
|
||||
if (f.useCounter.get() != 0) {
|
||||
Log.error("Remaining " + f);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public static DrawFile create(Lazy<File> png, Lazy<String> svg, Lazy<File> eps, Object signature) {
|
||||
DrawFile result = null;
|
||||
synchronized (toDelete) {
|
||||
if (signature != null) {
|
||||
result = cache.get(signature);
|
||||
}
|
||||
if (result == null) {
|
||||
result = new DrawFile(png, svg, eps);
|
||||
result = new DrawFile(png, svg, eps, signature == null ? null : signature.toString(), signature != null);
|
||||
if (signature != null) {
|
||||
cache.put(signature, result);
|
||||
Log.info("DrawFile cache size = " + cache.size());
|
||||
}
|
||||
FileUtils.deleteOnExit(result);
|
||||
deleteOnExit(result);
|
||||
}
|
||||
result.useCounter.addAndGet(1);
|
||||
result.totalUse.addAndGet(1);
|
||||
// checkCacheSize();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private static void checkCacheSize() {
|
||||
int min = Integer.MAX_VALUE;
|
||||
for (DrawFile f : cache.values()) {
|
||||
final int score = f.totalUse.get();
|
||||
if (score < min) {
|
||||
min = score;
|
||||
}
|
||||
}
|
||||
for (final Iterator<DrawFile> it = cache.values().iterator(); it.hasNext();) {
|
||||
final DrawFile f = it.next();
|
||||
if (f.useCounter.get() == 0 && f.totalUse.get() == min) {
|
||||
it.remove();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
if (toStringValue == null) {
|
||||
return super.toString() + " " + useCounter.get() + " " + totalUse.get();
|
||||
}
|
||||
return toStringValue + " " + useCounter.get() + " " + totalUse.get();
|
||||
}
|
||||
|
||||
public static DrawFile createFromFile(File fPng, String svg, File fEps) {
|
||||
final DrawFile result = new DrawFile(fPng, svg, fEps);
|
||||
FileUtils.deleteOnExit(result);
|
||||
final DrawFile result = new DrawFile(fPng, svg, fEps, fPng.getName(), false);
|
||||
result.useCounter.addAndGet(1);
|
||||
deleteOnExit(result);
|
||||
return result;
|
||||
}
|
||||
|
||||
private DrawFile(Lazy<File> png, Lazy<String> svg, Lazy<File> eps) {
|
||||
private static void deleteOnExit(DrawFile file) {
|
||||
synchronized (toDelete) {
|
||||
toDelete.add(file);
|
||||
}
|
||||
}
|
||||
|
||||
private DrawFile(Lazy<File> png, Lazy<String> svg, Lazy<File> eps, String signature, boolean cached) {
|
||||
this.png2 = new LazyFile(png);
|
||||
this.svg2 = new LazyCached<String>(svg);
|
||||
this.eps2 = new LazyFile(eps);
|
||||
this.toStringValue = signature;
|
||||
this.cached = cached;
|
||||
}
|
||||
|
||||
private DrawFile(File fPng, String svg, File fEps) {
|
||||
this(new Unlazy<File>(fPng), new Unlazy<String>(svg), new Unlazy<File>(fEps));
|
||||
private DrawFile(File fPng, String svg, File fEps, String signature, boolean cached) {
|
||||
this(new Unlazy<File>(fPng), new Unlazy<String>(svg), new Unlazy<File>(fEps), signature, cached);
|
||||
// if (svg.contains("\\")) {
|
||||
// System.err.println("svg="+svg);
|
||||
// throw new IllegalArgumentException();
|
||||
// }
|
||||
}
|
||||
|
||||
public File getPngOrEps(boolean isEps) throws IOException {
|
||||
if (isEps) {
|
||||
public File getPngOrEps(FileFormat format) throws IOException {
|
||||
checkUseable();
|
||||
if (format.isEps()) {
|
||||
if (eps2 == null) {
|
||||
throw new UnsupportedOperationException("No eps for " + getPng().getAbsolutePath());
|
||||
}
|
||||
return getEps();
|
||||
} else {
|
||||
}
|
||||
return getPng();
|
||||
}
|
||||
|
||||
private void checkUseable() {
|
||||
if (useable.get() == false) {
|
||||
throw new IllegalStateException("Useable false");
|
||||
}
|
||||
}
|
||||
|
||||
public File getPng() throws IOException {
|
||||
public synchronized File getPng() throws IOException {
|
||||
checkUseable();
|
||||
return png2.getNow();
|
||||
}
|
||||
|
||||
public String getSvg() throws IOException {
|
||||
public synchronized String getSvg() throws IOException {
|
||||
checkUseable();
|
||||
return svg2.getNow();
|
||||
}
|
||||
|
||||
public File getEps() throws IOException {
|
||||
public synchronized File getEps() throws IOException {
|
||||
checkUseable();
|
||||
return eps2.getNow();
|
||||
}
|
||||
|
||||
private void initSize() throws IOException {
|
||||
private synchronized void initSize() throws IOException {
|
||||
checkUseable();
|
||||
final BufferedImage im = ImageIO.read(getPng());
|
||||
widthPng = im.getWidth();
|
||||
heightPng = im.getHeight();
|
||||
}
|
||||
|
||||
public void delete() {
|
||||
Thread.yield();
|
||||
public synchronized void deleteDrawFile() {
|
||||
if (useable.get() == false) {
|
||||
return;
|
||||
}
|
||||
// checkUseable();
|
||||
final int count = useCounter.addAndGet(-1);
|
||||
if (count == 0) {
|
||||
if (cached && isCacheTooBig() == false) {
|
||||
return;
|
||||
}
|
||||
synchronized (toDelete) {
|
||||
deleteNow();
|
||||
if (cached) {
|
||||
final boolean removedCache = cache.values().remove(this);
|
||||
if (removedCache == false) {
|
||||
Log.error("Not found in cache " + this);
|
||||
}
|
||||
}
|
||||
final boolean removedToDelete = toDelete.remove(this);
|
||||
if (removedToDelete == false) {
|
||||
Log.error("Not found in delete list " + this);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static boolean isCacheTooBig() {
|
||||
return true;
|
||||
}
|
||||
|
||||
private synchronized void deleteNow() {
|
||||
useable.set(false);
|
||||
if (png2 != null && png2.isLoaded()) {
|
||||
try {
|
||||
Log.info("Deleting temporary file " + getPng());
|
||||
final boolean ok = getPng().delete();
|
||||
Log.info("Deleting temporary file " + png2.getNow());
|
||||
final boolean ok = png2.getNow().delete();
|
||||
if (ok == false) {
|
||||
Log.error("Cannot delete: " + getPng());
|
||||
Log.error("Cannot delete: " + png2.getNow());
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
@ -136,20 +250,20 @@ public class DrawFile {
|
||||
}
|
||||
if (eps2 != null && eps2.isLoaded()) {
|
||||
try {
|
||||
Log.info("Deleting temporary file " + getEps());
|
||||
final boolean ok2 = getEps().delete();
|
||||
Log.info("Deleting temporary file " + eps2.getNow());
|
||||
final boolean ok2 = eps2.getNow().delete();
|
||||
if (ok2 == false) {
|
||||
Log.error("Cannot delete: " + getEps());
|
||||
Log.error("Cannot delete: " + eps2.getNow());
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
Log.error("Problem deleting EPS file");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public final int getWidthPng() throws IOException {
|
||||
checkUseable();
|
||||
if (widthPng == -1) {
|
||||
initSize();
|
||||
}
|
||||
@ -157,18 +271,30 @@ public class DrawFile {
|
||||
}
|
||||
|
||||
public final int getHeightPng() throws IOException {
|
||||
checkUseable();
|
||||
if (widthPng == -1) {
|
||||
initSize();
|
||||
}
|
||||
return heightPng;
|
||||
}
|
||||
|
||||
// @Override
|
||||
// public String toString() {
|
||||
// if (svg == null) {
|
||||
// return getPng().toString();
|
||||
// }
|
||||
// return png + " " + svg.length();
|
||||
// }
|
||||
private static void addHook() {
|
||||
Runtime.getRuntime().addShutdownHook(new Thread() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (OptionFlags.getInstance().isKeepTmpFiles() == false) {
|
||||
synchronized (toDelete) {
|
||||
for (DrawFile f : toDelete) {
|
||||
final int cnt = f.useCounter.get();
|
||||
if (cnt != 0) {
|
||||
Log.info("Warning: useCounter " + cnt + " for " + f);
|
||||
}
|
||||
f.deleteNow();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -43,12 +43,13 @@ import javax.imageio.ImageIO;
|
||||
import net.sourceforge.plantuml.EmptyImageBuilder;
|
||||
import net.sourceforge.plantuml.FileUtils;
|
||||
import net.sourceforge.plantuml.skin.UDrawable;
|
||||
import net.sourceforge.plantuml.ugraphic.ColorMapper;
|
||||
import net.sourceforge.plantuml.ugraphic.eps.UGraphicEps;
|
||||
import net.sourceforge.plantuml.ugraphic.g2d.UGraphicG2d;
|
||||
|
||||
public class DrawFileFactory {
|
||||
|
||||
public static DrawFile create(final UDrawable drawable, final double width, final double height,
|
||||
public static DrawFile create(final ColorMapper colorMapper, final UDrawable drawable, final double width, final double height,
|
||||
final double dpiFactor, final Color backgground, Object signature) {
|
||||
|
||||
final Lazy<File> lpng = new Lazy<File>() {
|
||||
@ -57,7 +58,7 @@ public class DrawFileFactory {
|
||||
final EmptyImageBuilder builder = new EmptyImageBuilder(width * dpiFactor, height * dpiFactor,
|
||||
backgground);
|
||||
final BufferedImage im = builder.getBufferedImage();
|
||||
drawable.drawU(new UGraphicG2d(builder.getGraphics2D(), im, dpiFactor));
|
||||
drawable.drawU(new UGraphicG2d(colorMapper, builder.getGraphics2D(), im, dpiFactor));
|
||||
ImageIO.write(im, "png", png);
|
||||
return png;
|
||||
}
|
||||
@ -66,14 +67,14 @@ public class DrawFileFactory {
|
||||
final Lazy<File> leps = new Lazy<File>() {
|
||||
public File getNow() throws IOException {
|
||||
final File eps = FileUtils.createTempFile("visi", ".eps");
|
||||
UGraphicEps.copyEpsToFile(drawable, eps);
|
||||
UGraphicEps.copyEpsToFile(colorMapper, drawable, eps);
|
||||
return eps;
|
||||
}
|
||||
};
|
||||
|
||||
final Lazy<String> lsvg = new Lazy<String>() {
|
||||
public String getNow() throws IOException {
|
||||
return UGraphicG2d.getSvgString(drawable);
|
||||
return UGraphicG2d.getSvgString(colorMapper, drawable);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -28,7 +28,7 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 4826 $
|
||||
* Revision $Revision: 6711 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.cucadiagram.dot;
|
||||
@ -39,9 +39,11 @@ import java.io.OutputStream;
|
||||
|
||||
public interface Graphviz {
|
||||
|
||||
void createPng(OutputStream os) throws IOException, InterruptedException;
|
||||
void createFile(OutputStream os) throws IOException, InterruptedException;
|
||||
|
||||
File getDotExe();
|
||||
|
||||
String dotVersion() throws IOException, InterruptedException;
|
||||
|
||||
String testFile(String dotfilename, String outfile) throws IOException, InterruptedException;
|
||||
}
|
113
src/net/sourceforge/plantuml/cucadiagram/dot/GraphvizCached.java
Normal file
113
src/net/sourceforge/plantuml/cucadiagram/dot/GraphvizCached.java
Normal file
@ -0,0 +1,113 @@
|
||||
/* ========================================================================
|
||||
* 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: 6711 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.cucadiagram.dot;
|
||||
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.io.PrintWriter;
|
||||
import java.util.List;
|
||||
|
||||
import net.sourceforge.plantuml.FileUtils;
|
||||
import net.sourceforge.plantuml.Log;
|
||||
import net.sourceforge.plantuml.SignatureUtils;
|
||||
|
||||
public class GraphvizCached implements Graphviz {
|
||||
|
||||
private final AbstractGraphviz graphviz;
|
||||
|
||||
public GraphvizCached(AbstractGraphviz graphviz) {
|
||||
this.graphviz = graphviz;
|
||||
}
|
||||
|
||||
public void createFile(OutputStream os) throws IOException, InterruptedException {
|
||||
final File f = getCachedFile();
|
||||
|
||||
if (f.exists()) {
|
||||
Log.info("Using " + f);
|
||||
FileUtils.copyToStream(f, os);
|
||||
return;
|
||||
}
|
||||
|
||||
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
graphviz.createFile(baos);
|
||||
baos.close();
|
||||
final byte data[] = baos.toByteArray();
|
||||
|
||||
Log.info("Creating " + f);
|
||||
final OutputStream fos = new BufferedOutputStream(new FileOutputStream(f));
|
||||
fos.write(data);
|
||||
fos.close();
|
||||
|
||||
final InputStream is = new ByteArrayInputStream(data);
|
||||
FileUtils.copyToStream(is, os);
|
||||
is.close();
|
||||
}
|
||||
|
||||
private File getCachedFile() throws FileNotFoundException {
|
||||
final String dot = graphviz.getDotString();
|
||||
final List<String> types = graphviz.getType();
|
||||
final String sign = SignatureUtils.getSignature(dot + types);
|
||||
|
||||
final File source = new File("__graphviz", sign + ".txt");
|
||||
source.getParentFile().mkdirs();
|
||||
final PrintWriter pw = new PrintWriter(source);
|
||||
pw.println(types.toString());
|
||||
pw.println(dot);
|
||||
pw.close();
|
||||
|
||||
final File result = new File("__graphviz", sign);
|
||||
result.getParentFile().mkdirs();
|
||||
return result;
|
||||
}
|
||||
|
||||
public String dotVersion() throws IOException, InterruptedException {
|
||||
return graphviz.dotVersion();
|
||||
}
|
||||
|
||||
public File getDotExe() {
|
||||
return graphviz.getDotExe();
|
||||
}
|
||||
|
||||
public String testFile(String dotfilename, String outfile) throws IOException, InterruptedException {
|
||||
return graphviz.testFile(dotfilename, outfile);
|
||||
}
|
||||
|
||||
}
|
@ -28,23 +28,28 @@
|
||||
*
|
||||
* Original Author: Arnaud Roques
|
||||
*
|
||||
* Revision $Revision: 6200 $
|
||||
* Revision $Revision: 6713 $
|
||||
*
|
||||
*/
|
||||
package net.sourceforge.plantuml.cucadiagram.dot;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.PrintWriter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
|
||||
import net.sourceforge.plantuml.OptionFlags;
|
||||
import net.sourceforge.plantuml.StringUtils;
|
||||
|
||||
public class GraphvizUtils {
|
||||
|
||||
private static final String TMP_TEST_FILENAME = "testdottmp42";
|
||||
private static int DOT_VERSION_LIMIT = 226;
|
||||
|
||||
private static boolean isWindows() {
|
||||
@ -53,15 +58,22 @@ public class GraphvizUtils {
|
||||
|
||||
@Deprecated
|
||||
public static Graphviz create(String dotString, String... type) {
|
||||
final AbstractGraphviz result;
|
||||
if (isWindows()) {
|
||||
return new GraphvizWindows(dotString, type);
|
||||
result = new GraphvizWindows(dotString, type);
|
||||
} else {
|
||||
result = new GraphvizLinux(dotString, type);
|
||||
}
|
||||
return new GraphvizLinux(dotString, type);
|
||||
if (OptionFlags.GRAPHVIZCACHE && DotMaker.isJunit()) {
|
||||
return new GraphvizCached(result);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public static Graphviz create2(GraphvizLayoutStrategy strategy, String dotString, String... type) {
|
||||
return new AbstractGraphviz2(getOS(), strategy, dotString, type);
|
||||
}
|
||||
// public static Graphviz create2(GraphvizLayoutStrategy strategy, String
|
||||
// dotString, String... type) {
|
||||
// return new AbstractGraphviz2(getOS(), strategy, dotString, type);
|
||||
// }
|
||||
|
||||
static public File getDotExe() {
|
||||
return create(null, "png").getDotExe();
|
||||
@ -75,6 +87,14 @@ public class GraphvizUtils {
|
||||
return System.getenv("GRAPHVIZ_DOT");
|
||||
}
|
||||
|
||||
public static String getenvLogData() {
|
||||
final String env = System.getProperty("PLANTUML_LOGDATA");
|
||||
if (StringUtils.isNotEmpty(env)) {
|
||||
return env;
|
||||
}
|
||||
return System.getenv("PLANTUML_LOGDATA");
|
||||
}
|
||||
|
||||
private static String dotVersion = null;
|
||||
|
||||
public static String dotVersion() throws IOException, InterruptedException {
|
||||
@ -154,10 +174,16 @@ public class GraphvizUtils {
|
||||
result.add(bold + "Warning : Your dot installation seems old");
|
||||
result.add(bold + "Some diagrams may have issues");
|
||||
} else {
|
||||
result.add(bold + "Installation seems OK");
|
||||
String err = getTestCreateSimpleFile();
|
||||
if (err == null) {
|
||||
result.add(bold + "Installation seems OK. PNG generation OK");
|
||||
} else {
|
||||
result.add(red + err);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
result.add(red + e.toString());
|
||||
e.printStackTrace();
|
||||
}
|
||||
} else {
|
||||
@ -167,6 +193,35 @@ public class GraphvizUtils {
|
||||
return Collections.unmodifiableList(result);
|
||||
}
|
||||
|
||||
static String getTestCreateSimpleFile() throws IOException, InterruptedException {
|
||||
final Graphviz graphviz = GraphvizUtils.create("", "png");
|
||||
final File f = new File(TMP_TEST_FILENAME + ".dot");
|
||||
final File fout = new File(TMP_TEST_FILENAME + ".png");
|
||||
f.delete();
|
||||
fout.delete();
|
||||
try {
|
||||
final PrintWriter pw = new PrintWriter(f);
|
||||
pw.println("digraph foo { test; }");
|
||||
pw.close();
|
||||
graphviz.testFile(f.getName(), fout.getName());
|
||||
f.delete();
|
||||
if (fout.exists() == false) {
|
||||
return "Error: dot cannot generated PNG file. Check you dot installation.";
|
||||
}
|
||||
if (fout.length() == 0) {
|
||||
return "Error: dot generates empty PNG file. Check you dot installation.";
|
||||
}
|
||||
try {
|
||||
ImageIO.read(fout);
|
||||
} catch (IOException e) {
|
||||
return "Error: dot generates unreadable PNG file. Check you dot installation.";
|
||||
}
|
||||
return null;
|
||||
} finally {
|
||||
fout.delete();
|
||||
}
|
||||
}
|
||||
|
||||
public static OS getOS() {
|
||||
if (isWindows()) {
|
||||
return new OSWindows();
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user