5d37701fb25ba0fdbc85f97120d55dc41acd2ac3
[clamp.git] / src / main / java / org / onap / clamp / clds / util / drawing / ImageBuilder.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP CLAMP
4  * ================================================================================
5  * Copyright (C) 2019 Nokia. All rights
6  *                             reserved.
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
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
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  * ===================================================================
21  *
22  */
23
24 package org.onap.clamp.clds.util.drawing;
25
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;
33
34 public class ImageBuilder {
35
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;
40
41     private Point currentPoint;
42     private final int baseLength;
43     private final int rectHeight;
44     private final SVGGraphics2D g2d;
45     private final DocumentBuilder documentBuilder;
46
47     private static final int LINE_THICKNESS = 2;
48     private static final int CIRCLE_RADIUS = 17;
49
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;
57     }
58
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);
62
63         handleBasedOnRectType(rectType, text, point, baseLength, rectHeight);
64
65         documentBuilder.pushChangestoDocument(g2d, dataElementId);
66         currentPoint = next;
67         return this;
68     }
69
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);
75         currentPoint = to;
76         return this;
77     }
78
79     ImageBuilder circle(String dataElementId, int lineThickness) {
80         Point to = new Point(currentPoint.x + 2 * CIRCLE_RADIUS, currentPoint.y);
81         Shape circleStart =
82             new Ellipse2D.Double(currentPoint.x, currentPoint.y - CIRCLE_RADIUS,
83                 2 * CIRCLE_RADIUS, 2 * CIRCLE_RADIUS);
84
85         Stroke oldStroke = g2d.getStroke();
86         g2d.setStroke(new BasicStroke(lineThickness));
87         g2d.draw(circleStart);
88         g2d.setStroke(oldStroke);
89         documentBuilder.pushChangestoDocument(g2d, dataElementId);
90         currentPoint = to;
91         return this;
92     }
93
94     DocumentBuilder getDocumentBuilder() {
95         return documentBuilder;
96     }
97
98     private void handleBasedOnRectType(RectTypes rectType, String text, Point point, int width, int height) {
99         AwtUtils.rectWithText(g2d, text, point, width, height);
100         switch (rectType) {
101             case COLECTOR:
102                 drawVerticalLineForCollector(point, width, height);
103                 break;
104             case MICROSERVICE:
105                 drawHorizontalLineForMicroService(point, width, height);
106                 break;
107             case POLICY:
108                 drawDiagonalLineForPolicy(point, width, height);
109                 break;
110         }
111     }
112
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,
115                      point.y + height);
116     }
117
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);
121     }
122
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);
125     }
126
127     private int calculateMsHorizontalLineYCoordinate(Point point, int height) {
128         return (int)(point.y * height * MS_LINE_TO_HEIGHT_RATIO);
129     }
130
131     private Point coordinatesForRectangle(Point from, Point next) {
132         int x = from.x;
133         int y = from.y - next.y + LINE_THICKNESS / 2;
134         return new Point(x,y);
135     }
136
137 }