/* * Copyright (c) 2014 EMC Corporation * All Rights Reserved */ package com.emc.storageos.db.client.constraint; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.xml.bind.annotation.XmlRootElement; import com.emc.storageos.db.client.impl.ColumnField; import com.emc.storageos.db.client.impl.DataObjectType; import com.emc.storageos.db.client.impl.TypeMap; /** * The constraint to be sent across DCs * The concreted constraints are too complicated to be sent, * so we use this class to represent a constraint to be sent across DCs * and use it to re-generate the corresponding Constraint subclass on the server side */ @XmlRootElement public class ConstraintDescriptor { @SuppressWarnings("unused") private static final Logger log = LoggerFactory.getLogger(ConstraintDescriptor.class); private String constraintClassName; private String dataObjectClassName; private String columnFieldName; private List<Object> arguments; private int columnFieldPosition; public ConstraintDescriptor() { } public String getConstraintClassName() { return constraintClassName; } public void setConstraintClassName(String constraintClassName) { this.constraintClassName = constraintClassName; } public String getDataObjectClassName() { return dataObjectClassName; } public void setDataObjectClassName(String dataObjectClassName) { this.dataObjectClassName = dataObjectClassName; } public String getColumnFieldName() { return columnFieldName; } public void setColumnFieldName(String columnFieldName) { this.columnFieldName = columnFieldName; } public List<Object> getArguments() { return arguments; } public void setArguments(List<Object> arguments) { this.arguments = arguments; } public int getColumnFieldPosition() { return columnFieldPosition; } public void setColumnFieldPosition(int columnFieldPosition) { this.columnFieldPosition = columnFieldPosition; } public Constraint toConstraint() throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException , InvocationTargetException, InstantiationException { log.info("ConstraintDescriptor {}", this); Class type = Class.forName(dataObjectClassName); DataObjectType doType = TypeMap.getDoType(type); ColumnField field = doType.getColumnField(columnFieldName); Class constraintClass = Class.forName(constraintClassName); List<Class> parameterTypes = new ArrayList(arguments.size() + 1); List<Object> args = new ArrayList(arguments.size() + 1); int i = 1; for (Object arg : arguments) { if (i == columnFieldPosition) { parameterTypes.add(ColumnField.class); args.add(field); } i++; parameterTypes.add(arg.getClass()); args.add(arg); } if (i == columnFieldPosition) { parameterTypes.add(ColumnField.class); args.add(field); } Constructor constructor = constraintClass.getConstructor(parameterTypes.toArray(new Class[0])); Constraint constraint = (Constraint) constructor.newInstance(args.toArray()); return constraint; } @Override public String toString() { StringBuilder builder = new StringBuilder(getClass().getName()); builder.append("\n\tConstraint Class:"); builder.append(constraintClassName); builder.append("\n\tDataObject class:"); builder.append(dataObjectClassName); builder.append("\n\tColumne field:"); builder.append(columnFieldName); builder.append("\n\tColumnField position:"); builder.append(columnFieldPosition); builder.append("\n\targuments:"); for (Object arg : arguments) { builder.append("\n\t\t type:"); builder.append(arg.getClass().getName()); builder.append("\n\t\t value:"); builder.append(arg.toString()); } return builder.toString(); } }