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;
39 public static final float ARROW_TO_BASELINE_RATIO = 0.75f;
41 private Point currentPoint;
42 private final int baseLength;
43 private final int rectHeight;
44 private final SVGGraphics2D g2d;
45 private final DocumentBuilder documentBuilder;
47 private static final int LINE_THICKNESS = 2;
48 private static final int CIRCLE_RADIUS = 17;
50 ImageBuilder(SVGGraphics2D svgGraphics2D, DocumentBuilder documentBuilder,
51 Point startingPoint, int baseLength, int rectHeight) {
52 this.g2d = svgGraphics2D;
53 this.documentBuilder = documentBuilder;
54 this.currentPoint = new Point(startingPoint);
55 this.baseLength = baseLength;
56 this.rectHeight = rectHeight;
59 ImageBuilder rectangle(String dataElementId, RectTypes rectType, String text) {
60 Point next = new Point(currentPoint.x + baseLength, currentPoint.y);
61 Point point = coordinatesForRectangle(currentPoint, next);
63 handleBasedOnRectType(rectType, text, point, baseLength, rectHeight);
65 documentBuilder.pushChangestoDocument(g2d, dataElementId);
70 ImageBuilder arrow() {
71 String dataElementId = "Arrow-" + UUID.randomUUID().toString();
72 Point to = new Point(currentPoint.x + (int)(baseLength*ARROW_TO_BASELINE_RATIO), currentPoint.y);
73 AwtUtils.drawArrow(g2d, currentPoint, to, LINE_THICKNESS);
74 documentBuilder.pushChangestoDocument(g2d, dataElementId);
79 ImageBuilder circle(String dataElementId, int lineThickness) {
80 Point to = new Point(currentPoint.x + 2 * CIRCLE_RADIUS, currentPoint.y);
82 new Ellipse2D.Double(currentPoint.x, currentPoint.y - CIRCLE_RADIUS,
83 2 * CIRCLE_RADIUS, 2 * CIRCLE_RADIUS);
85 Stroke oldStroke = g2d.getStroke();
86 g2d.setStroke(new BasicStroke(lineThickness));
87 g2d.draw(circleStart);
88 g2d.setStroke(oldStroke);
89 documentBuilder.pushChangestoDocument(g2d, dataElementId);
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);
113 private void drawVerticalLineForCollector(Point point, int width, int height) {
114 g2d.drawLine(point.x + width / COLLECTOR_LINE_RATIO, point.y, point.x + width / COLLECTOR_LINE_RATIO,
118 private void drawHorizontalLineForMicroService(Point point, int width, int height) {
119 int y = calculateMsHorizontalLineYCoordinate(point,height);
120 g2d.drawLine(point.x, y, point.x + width, y);
123 private void drawDiagonalLineForPolicy(Point point, int width, int height) {
124 g2d.drawLine(point.x, point.y + height / POLICY_LINE_RATIO, point.x + width / POLICY_LINE_RATIO, point.y);
127 private int calculateMsHorizontalLineYCoordinate(Point point, int height) {
128 return (int)(point.y * height * MS_LINE_TO_HEIGHT_RATIO);
131 private Point coordinatesForRectangle(Point from, Point next) {
133 int y = from.y - next.y + LINE_THICKNESS / 2;
134 return new Point(x,y);