2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2019 Nokia. All rights
7 * ================================================================================
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 * ============LICENSE_END============================================
20 * ===================================================================
24 package org.onap.clamp.clds.util.drawing;
26 import java.awt.BasicStroke;
27 import java.awt.Point;
28 import java.awt.Shape;
29 import java.awt.Stroke;
30 import java.awt.geom.Ellipse2D;
31 import java.util.UUID;
33 import org.apache.batik.svggen.SVGGraphics2D;
35 public class ImageBuilder {
37 public static final int POLICY_LINE_RATIO = 2;
38 public static final int COLLECTOR_LINE_RATIO = 6;
39 public static final float MS_LINE_TO_HEIGHT_RATIO = 0.75f;
40 public static final float ARROW_TO_BASELINE_RATIO = 0.75f;
42 private Point currentPoint;
43 private final int baseLength;
44 private final int rectHeight;
45 private final SVGGraphics2D g2d;
46 private final DocumentBuilder documentBuilder;
48 private static final int LINE_THICKNESS = 2;
49 private static final int CIRCLE_RADIUS = 17;
51 ImageBuilder(SVGGraphics2D svgGraphics2D, DocumentBuilder documentBuilder, Point startingPoint, int baseLength,
53 this.g2d = svgGraphics2D;
54 this.documentBuilder = documentBuilder;
55 this.currentPoint = new Point(startingPoint);
56 this.baseLength = baseLength;
57 this.rectHeight = rectHeight;
60 ImageBuilder rectangle(String dataElementId, RectTypes rectType, String text) {
61 Point next = new Point(currentPoint.x + baseLength, currentPoint.y);
62 Point point = coordinatesForRectangle(currentPoint, next);
64 handleBasedOnRectType(rectType, text, point, baseLength, rectHeight);
66 documentBuilder.pushChangestoDocument(g2d, dataElementId);
71 ImageBuilder arrow() {
72 String dataElementId = "Arrow-" + UUID.randomUUID().toString();
73 Point to = new Point(currentPoint.x + (int) (baseLength * ARROW_TO_BASELINE_RATIO), currentPoint.y);
74 AwtUtils.drawArrow(g2d, currentPoint, to, LINE_THICKNESS);
75 documentBuilder.pushChangestoDocument(g2d, dataElementId);
80 ImageBuilder circle(String dataElementId, int lineThickness) {
81 Shape circleStart = new Ellipse2D.Double(currentPoint.x, ((double) currentPoint.y) - CIRCLE_RADIUS,
82 2.0 * CIRCLE_RADIUS, 2.0 * CIRCLE_RADIUS);
84 Stroke oldStroke = g2d.getStroke();
85 g2d.setStroke(new BasicStroke(lineThickness));
86 g2d.draw(circleStart);
87 g2d.setStroke(oldStroke);
88 documentBuilder.pushChangestoDocument(g2d, dataElementId);
89 Point to = new Point(currentPoint.x + 2 * CIRCLE_RADIUS, currentPoint.y);
94 DocumentBuilder getDocumentBuilder() {
95 return documentBuilder;
98 private void handleBasedOnRectType(RectTypes rectType, String text, Point point, int width, int height) {
99 AwtUtils.rectWithText(g2d, text, point, width, height);
102 drawVerticalLineForCollector(point, width, height);
105 drawHorizontalLineForMicroService(point, width, height);
108 drawDiagonalLineForPolicy(point, width, height);
114 private void drawVerticalLineForCollector(Point point, int width, int height) {
115 g2d.drawLine(point.x + width / COLLECTOR_LINE_RATIO, point.y, point.x + width / COLLECTOR_LINE_RATIO,
119 private void drawHorizontalLineForMicroService(Point point, int width, int height) {
120 int pointY = calculateMsHorizontalLineYCoordinate(point, height);
121 g2d.drawLine(point.x, pointY, point.x + width, pointY);
124 private void drawDiagonalLineForPolicy(Point point, int width, int height) {
125 g2d.drawLine(point.x, point.y + height / POLICY_LINE_RATIO, point.x + width / POLICY_LINE_RATIO, point.y);
128 private int calculateMsHorizontalLineYCoordinate(Point point, int height) {
129 return (int) (point.y * height * MS_LINE_TO_HEIGHT_RATIO);
132 private Point coordinatesForRectangle(Point from, Point next) {
134 int pointY = from.y - next.y + LINE_THICKNESS / 2;
135 return new Point(pointX, pointY);