package com.griddynamics.jagger.dbapi.util; import com.griddynamics.jagger.dbapi.dto.PlotSingleDto.PointShape; import com.griddynamics.jagger.util.MonitoringIdUtils; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicInteger; import static org.apache.commons.collections.CollectionUtils.isNotEmpty; public class PlotPointShapeGenerator { private static AtomicInteger counter = new AtomicInteger(0); private static ConcurrentMap<String, Integer> sessionsMap = new ConcurrentHashMap<>(); public static PointShape generatePointShape(String metricId, String sessionId) { return generatePointShape(Collections.singletonList(metricId), sessionId); } private static PointShape generatePointShape(List<String> metricIds, String sessionId) { List<String> shapeIds = new ArrayList<>(); if (isNotEmpty(metricIds)) { // Search if metricId or its synonyms already has shape for (String metricId : metricIds) { MonitoringIdUtils.MonitoringId monitoringId = MonitoringIdUtils.splitMonitoringMetricId(metricId); String shapeId = (monitoringId != null) ? (monitoringId.getMonitoringName() + sessionId) : (metricId + sessionId); shapeIds.add(shapeId); // Shape found if (sessionsMap.containsKey(shapeId)) { Integer indexOfShape = sessionsMap.get(shapeId); for (String shapeID : shapeIds) { sessionsMap.put(shapeID, indexOfShape); } return PointShape.values()[indexOfShape]; } } } // Shape was not set before int indexOfShape = counter.getAndIncrement() % PointShape.values().length; for (String shapeID : shapeIds) { sessionsMap.put(shapeID, indexOfShape); } return PointShape.values()[indexOfShape]; } }