package rocks.inspectit.shared.cs.ci;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.RandomStringUtils;
import org.apache.commons.lang.math.RandomUtils;
import rocks.inspectit.shared.cs.ci.assignment.AbstractClassSensorAssignment;
import rocks.inspectit.shared.cs.ci.assignment.impl.ExceptionSensorAssignment;
import rocks.inspectit.shared.cs.ci.assignment.impl.JmxBeanSensorAssignment;
import rocks.inspectit.shared.cs.ci.assignment.impl.MethodSensorAssignment;
import rocks.inspectit.shared.cs.ci.assignment.impl.TimerMethodSensorAssignment;
import rocks.inspectit.shared.cs.ci.context.AbstractContextCapture;
import rocks.inspectit.shared.cs.ci.context.impl.FieldContextCapture;
import rocks.inspectit.shared.cs.ci.context.impl.ParameterContextCapture;
import rocks.inspectit.shared.cs.ci.context.impl.ReturnContextCapture;
import rocks.inspectit.shared.cs.ci.exclude.ExcludeRule;
import rocks.inspectit.shared.cs.ci.profile.data.ExcludeRulesProfileData;
import rocks.inspectit.shared.cs.ci.profile.data.JmxDefinitionProfileData;
import rocks.inspectit.shared.cs.ci.profile.data.SensorAssignmentProfileData;
import rocks.inspectit.shared.cs.ci.sensor.method.impl.PreparedStatementSensorConfig;
/**
* Only for testing purposes.
*
* @author Ivan Senic
*
*/
// NOCHKALL
@SuppressWarnings("PMD")
public final class CiDataFactory {
private final static String[] NAMES = new String[] { "Test", "Dev", "Production", "My", "Yours", "First", "Second" };
private final static String[] CLASSES = new String[] { "*", "com.oracle.*", "my.concrete.Class", "*.spring.*", "your.concrete.Class" };
private final static String[] METHODS = new String[] { "*", "execute", "perform*", "toString" };
private final static String[] PARAMETERS = new String[] { "int", "long", "boolean", "java.util.String" };
public static List<Profile> getProfiles(int size) {
if (size == 0) {
return null;
}
List<Profile> profiles = new ArrayList<>(size);
for (int i = 0; i < size; i++) {
profiles.add(getProfile());
}
return profiles;
}
public static Profile getProfile() {
Profile profile = new Profile();
profile.setName(getRandomNamePrefix() + " Profile");
profile.setDescription(RandomStringUtils.randomAlphabetic(30));
SensorAssignmentProfileData sensorAssignmentProfileData = new SensorAssignmentProfileData();
sensorAssignmentProfileData.setMethodSensorAssignments(getMethodSensorAssignment(RandomUtils.nextInt(5)));
sensorAssignmentProfileData.setExceptionSensorAssignments(getExceptionSensorAssignments(RandomUtils.nextInt(5)));
ExcludeRulesProfileData excludeRulesProfileData = new ExcludeRulesProfileData();
excludeRulesProfileData.setExcludeRules(Collections.singletonList(getExcludeRule()));
JmxDefinitionProfileData jmxDefinitionProfileData = new JmxDefinitionProfileData();
jmxDefinitionProfileData.setJmxBeanAssignments(Collections.singletonList(getJmxBeanSensorAssignment()));
if (RandomUtils.nextBoolean()) {
profile.setProfileData(sensorAssignmentProfileData);
} else if (RandomUtils.nextBoolean()) {
profile.setProfileData(excludeRulesProfileData);
} else {
profile.setProfileData(jmxDefinitionProfileData);
}
return profile;
}
public static List<Environment> getEnvironments(int size) {
if (size == 0) {
return null;
}
List<Environment> environment = new ArrayList<>(size);
for (int i = 0; i < size; i++) {
environment.add(getEnvironment());
}
return environment;
}
public static Environment getEnvironment() {
Environment environment = new Environment();
environment.setName(getRandomNamePrefix() + " Environment");
// environment.setProfiles(getProfiles(RandomUtils.nextInt(5)));
return environment;
}
public static List<AgentMapping> getAgentMappings(int size) {
if (size == 0) {
return null;
}
return getAgentMappings(size, getEnvironments(RandomUtils.nextInt(5)));
}
public static List<AgentMapping> getAgentMappings(int size, List<Environment> environments) {
List<AgentMapping> agentMappings = new ArrayList<>(size);
for (int i = 0; i < size; i++) {
agentMappings.add(getAgentMapping(environments));
}
return agentMappings;
}
public static AgentMapping getAgentMapping() {
return getAgentMapping(getEnvironments(RandomUtils.nextInt(5)));
}
public static AgentMapping getAgentMapping(List<Environment> environments) {
AgentMapping mapping = new AgentMapping();
mapping.setActive(RandomUtils.nextBoolean());
mapping.setAgentName(RandomStringUtils.randomAlphabetic(20));
mapping.setIpAddress(RandomStringUtils.randomNumeric(16));
return mapping;
}
public static List<MethodSensorAssignment> getMethodSensorAssignment(int size) {
if (size == 0) {
return null;
}
List<MethodSensorAssignment> assignments = new ArrayList<>(size);
for (int i = 0; i < size; i++) {
if (RandomUtils.nextBoolean()) {
assignments.add(getSqlMethodSensorAssignment());
} else {
assignments.add(getTimerMethodSensorAssignment());
}
}
return assignments;
}
public static List<ExceptionSensorAssignment> getExceptionSensorAssignments(int size) {
if (size == 0) {
return null;
}
List<ExceptionSensorAssignment> assignments = new ArrayList<>(size);
for (int i = 0; i < size; i++) {
assignments.add(getExceptionSensorAssignment());
}
return assignments;
}
public static ExceptionSensorAssignment getExceptionSensorAssignment() {
ExceptionSensorAssignment assignment = new ExceptionSensorAssignment();
populateClassSensorAssignment(assignment);
return assignment;
}
public static MethodSensorAssignment getSqlMethodSensorAssignment() {
MethodSensorAssignment assignment = new MethodSensorAssignment(PreparedStatementSensorConfig.class);
populateMethodSensorAssignment(assignment);
return assignment;
}
public static ExcludeRule getExcludeRule() {
ExcludeRule rule = new ExcludeRule();
rule.setClassName(getRandomClass());
return rule;
}
public static JmxBeanSensorAssignment getJmxBeanSensorAssignment() {
JmxBeanSensorAssignment jmxAssignment = new JmxBeanSensorAssignment();
jmxAssignment.setDomain("domain");
jmxAssignment.setObjectNameParameters(Collections.singletonMap("type", "Type"));
jmxAssignment.setAttributes(new HashSet<>(Arrays.asList("att1, att2")));
return jmxAssignment;
}
public static TimerMethodSensorAssignment getTimerMethodSensorAssignment() {
TimerMethodSensorAssignment assignment = new TimerMethodSensorAssignment();
populateMethodSensorAssignment(assignment);
List<AbstractContextCapture> contextCaptures = new ArrayList<>();
if (RandomUtils.nextBoolean()) {
ReturnContextCapture returnContextCapture = new ReturnContextCapture();
returnContextCapture.setDisplayName("myReturn");
contextCaptures.add(returnContextCapture);
}
if (RandomUtils.nextBoolean() && CollectionUtils.isNotEmpty(assignment.getParameters())) {
ParameterContextCapture parameterContextCapture = new ParameterContextCapture();
parameterContextCapture.setDisplayName("myParam");
parameterContextCapture.setIndex(0);
List<String> paths = new ArrayList<>();
paths.add("user");
paths.add("surname");
parameterContextCapture.setPaths(paths);
contextCaptures.add(parameterContextCapture);
}
if (RandomUtils.nextBoolean()) {
FieldContextCapture fieldContextCapture = new FieldContextCapture();
fieldContextCapture.setDisplayName("myField");
fieldContextCapture.setFieldName("message");
}
assignment.setCharting(RandomUtils.nextBoolean());
if (CollectionUtils.isNotEmpty(contextCaptures)) {
assignment.setContextCaptures(contextCaptures);
}
return assignment;
}
private static void populateMethodSensorAssignment(MethodSensorAssignment assignment) {
populateClassSensorAssignment(assignment);
if (RandomUtils.nextBoolean()) {
assignment.setConstructor(true);
} else {
assignment.setMethodName(getRandomMethod());
}
if (RandomUtils.nextBoolean()) {
assignment.setParameters(getRandomParameters());
}
if (RandomUtils.nextBoolean()) {
if (RandomUtils.nextBoolean()) {
assignment.setPublicModifier(true);
}
if (RandomUtils.nextBoolean()) {
assignment.setProtectedModifier(true);
}
if (RandomUtils.nextBoolean()) {
assignment.setPrivateModifier(true);
}
if (RandomUtils.nextBoolean()) {
assignment.setDefaultModifier(true);
}
}
}
private static void populateClassSensorAssignment(AbstractClassSensorAssignment<?> assignment) {
assignment.setClassName(getRandomClass());
if (RandomUtils.nextBoolean()) {
assignment.setInterf(true);
} else if (RandomUtils.nextBoolean()) {
assignment.setSuperclass(true);
}
if (RandomUtils.nextBoolean()) {
assignment.setAnnotation("javax.Service");
}
}
private static String getRandomNamePrefix() {
return NAMES[RandomUtils.nextInt(NAMES.length)];
}
private static String getRandomClass() {
return CLASSES[RandomUtils.nextInt(CLASSES.length)];
}
private static String getRandomMethod() {
return METHODS[RandomUtils.nextInt(METHODS.length)];
}
private static List<String> getRandomParameters() {
List<String> params = new ArrayList<>();
int s = RandomUtils.nextInt(PARAMETERS.length);
for (int i = 0; i < s; i++) {
String p = PARAMETERS[RandomUtils.nextInt(PARAMETERS.length)];
if (!params.contains(p)) {
params.add(p);
}
}
return params;
}
}