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;
32 import org.apache.batik.svggen.SVGGraphics2D;
34 public class ImageBuilder {
36 public static final int POLICY_LINE_RATIO = 2;
37 public static final int COLLECTOR_LINE_RATIO = 6;
38 public static final float MS_LINE_TO_HEIGHT_RATIO = 0.75f;
40 private Point currentPoint;
41 private final int baseLength;
42 private final int rectHeight;
43 private final SVGGraphics2D g2d;
44 private final DocumentBuilder documentBuilder;
46 private static final int LINE_THICKNESS = 2;
47 private static final int CIRCLE_RADIUS = 17;
49 ImageBuilder(SVGGraphics2D svgGraphics2D, DocumentBuilder documentBuilder,
50 Point startingPoint, int baseLength, int rectHeight) {
51 this.g2d = svgGraphics2D;
52 this.documentBuilder = documentBuilder;
53 this.currentPoint = new Point(startingPoint);
54 this.baseLength = baseLength;
55 this.rectHeight = rectHeight;
58 ImageBuilder rectangle(String dataElementId, RectTypes rectType, String text) {
59 Point next = new Point(currentPoint.x + baseLength, currentPoint.y);
60 Point point = coordinatesForRectangle(currentPoint, next);
62 handleBasedOnRectType(rectType, text, point, baseLength, rectHeight);
64 documentBuilder.pushChangestoDocument(g2d, dataElementId);
69 ImageBuilder arrow() {
70 String dataElementId = "Arrow-" + UUID.randomUUID().toString();
71 Point to = new Point(currentPoint.x + baseLength, currentPoint.y);
72 AwtUtils.drawArrow(g2d, currentPoint, to, LINE_THICKNESS);
73 documentBuilder.pushChangestoDocument(g2d, dataElementId);
78 ImageBuilder circle(String dataElementId, int lineThickness) {
79 Point to = new Point(currentPoint.x + 2 * CIRCLE_RADIUS, currentPoint.y);
81 new Ellipse2D.Double(currentPoint.x, currentPoint.y - CIRCLE_RADIUS,
82 2 * CIRCLE_RADIUS, 2 * 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);
93 DocumentBuilder getDocumentBuilder() {
94 return documentBuilder;
97 private void handleBasedOnRectType(RectTypes rectType, String text, Point point, int width, int height) {
98 AwtUtils.rectWithText(g2d, text, point, width, height);
101 drawVerticalLineForCollector(point, width, height);
104 drawHorizontalLineForMicroService(point, width, height);
107 drawDiagonalLineForPolicy(point, width, height);
112 private void drawVerticalLineForCollector(Point point, int width, int height) {
113 g2d.drawLine(point.x + width / COLLECTOR_LINE_RATIO, point.y, point.x + width / COLLECTOR_LINE_RATIO,
117 private void drawHorizontalLineForMicroService(Point point, int width, int height) {
118 int y = calculateMsHorizontalLineYCoordinate(point,height);
119 g2d.drawLine(point.x, y, point.x + width, y);
122 private void drawDiagonalLineForPolicy(Point point, int width, int height) {
123 g2d.drawLine(point.x, point.y + height / POLICY_LINE_RATIO, point.x + width / POLICY_LINE_RATIO, point.y);
126 private int calculateMsHorizontalLineYCoordinate(Point point, int height) {
127 return (int)(point.y * height * MS_LINE_TO_HEIGHT_RATIO);
130 private Point coordinatesForRectangle(Point from, Point next) {
132 int y = from.y - next.y + LINE_THICKNESS / 2;
133 return new Point(x,y);