changed control point api

This commit is contained in:
bancika
2011-01-05 19:21:59 +00:00
parent 8db24c2588
commit 51eee908c2
10 changed files with 106 additions and 348 deletions
@@ -11,8 +11,6 @@ import java.awt.Shape;
import org.diylc.core.ComponentState;
import org.diylc.core.IDIYComponent;
import org.diylc.core.Project;
import org.diylc.core.VisibilityPolicy;
import org.diylc.core.annotations.ControlPoint;
import org.diylc.core.annotations.EditableProperty;
import org.diylc.core.measures.Size;
import org.diylc.utils.Constants;
@@ -34,8 +32,8 @@ public abstract class AbstractLeadedDIYComponent<T> implements IDIYComponent<T>
protected Size width;
protected Size height;
protected Point point1 = new Point(0, 0);
protected Point point2 = new Point((int) (Constants.GRID * 10), 0);
protected Point[] points = new Point[] { new Point(0, 0),
new Point((int) (Constants.GRID * 10), 0) };
protected String name = "New Component";
protected AbstractLeadedDIYComponent() {
@@ -76,25 +74,40 @@ public abstract class AbstractLeadedDIYComponent<T> implements IDIYComponent<T>
*/
protected abstract Color getBorderColor();
@Override
public int getControlPointCount() {
return points.length;
}
@Override
public Point getControlPoint(int index) {
return (Point) points[index].clone();
}
@Override
public void setControlPoint(Point point, int index) {
points[index].setLocation(point);
}
@Override
public void draw(Graphics2D g2d, ComponentState componentState, Project project) {
g2d.setColor(LEAD_COLOR);
g2d.setStroke(new BasicStroke(1));
double distance = point1.distance(point2);
double distance = points[0].distance(points[1]);
Shape shape = getComponentShape();
Rectangle shapeRect = shape.getBounds();
double leadLenght = (distance - shapeRect.width) / 2;
Double theta;
theta = Math.atan2(point2.y - point1.y, point2.x - point1.x);
theta = Math.atan2(points[1].y - points[0].y, points[1].x - points[0].x);
// Draw leads.
g2d.drawLine(point1.x, point1.y, (int) (point1.x + leadLenght * Math.cos(theta)),
(int) (point1.y + leadLenght * Math.sin(theta)));
g2d.drawLine(point2.x, point2.y, (int) (point2.x - leadLenght * Math.cos(theta)),
(int) (point2.y - leadLenght * Math.sin(theta)));
g2d.drawLine(points[0].x, points[0].y, (int) (points[0].x + leadLenght * Math.cos(theta)),
(int) (points[0].y + leadLenght * Math.sin(theta)));
g2d.drawLine(points[1].x, points[1].y, (int) (points[1].x - leadLenght * Math.cos(theta)),
(int) (points[1].y - leadLenght * Math.sin(theta)));
// Transform graphics to draw the body in the right place and at the
// right angle.
g2d.translate((point1.x + point2.x - shapeRect.width) / 2,
(point1.y + point2.y - shapeRect.height) / 2);
g2d.translate((points[0].x + points[1].x - shapeRect.width) / 2,
(points[0].y + points[1].y - shapeRect.height) / 2);
g2d.rotate(theta, shapeRect.width / 2, shapeRect.height / 2);
// Draw body.
if (componentState != ComponentState.DRAGGING) {
@@ -123,24 +136,6 @@ public abstract class AbstractLeadedDIYComponent<T> implements IDIYComponent<T>
this.name = name;
}
@ControlPoint(visibilityPolicy = VisibilityPolicy.WHEN_SELECTED)
public Point getPoint1() {
return point1;
}
public void setPoint1(Point point1) {
this.point1 = point1;
}
@ControlPoint(visibilityPolicy = VisibilityPolicy.WHEN_SELECTED)
public Point getPoint2() {
return point2;
}
public void setPoint2(Point point2) {
this.point2 = point2;
}
@EditableProperty(defaultable = true)
public Size getWidth() {
return width;
@@ -9,9 +9,7 @@ import java.awt.geom.Rectangle2D;
import org.diylc.core.ComponentState;
import org.diylc.core.IDIYComponent;
import org.diylc.core.Project;
import org.diylc.core.VisibilityPolicy;
import org.diylc.core.annotations.ComponentDescriptor;
import org.diylc.core.annotations.ControlPoint;
import org.diylc.core.annotations.EditableProperty;
import org.diylc.utils.Constants;
@@ -48,18 +46,23 @@ public class DIL_IC implements IDIYComponent<String> {
this.value = value;
}
@ControlPoint(visibilityPolicy = VisibilityPolicy.WHEN_SELECTED)
public Point getPoint1() {
return point1;
@Override
public int getControlPointCount() {
return 2;
}
public void setPoint1(Point point1) {
this.point1 = point1;
@Override
public Point getControlPoint(int index) {
return index == 0 ? point1 : point2;
}
@ControlPoint(visibilityPolicy = VisibilityPolicy.WHEN_SELECTED)
public Point getPoint2() {
return point2;
@Override
public void setControlPoint(Point point, int index) {
if (index == 0) {
point1.setLocation(point);
} else {
point2.setLocation(point);
}
}
public void setPoint2(Point point2) {
@@ -7,9 +7,7 @@ import java.awt.Point;
import org.diylc.core.ComponentState;
import org.diylc.core.IDIYComponent;
import org.diylc.core.Project;
import org.diylc.core.VisibilityPolicy;
import org.diylc.core.annotations.ComponentDescriptor;
import org.diylc.core.annotations.ControlPoint;
import org.diylc.core.annotations.EditableProperty;
import org.diylc.core.measures.Capacitance;
import org.diylc.core.measures.CapacitanceUnit;
@@ -19,7 +17,7 @@ import org.diylc.core.measures.Size;
import org.diylc.core.measures.SizeUnit;
@ComponentDescriptor(name = "Mock", author = "bancika", category = "Sample", instanceNamePrefix = "M", desciption = "test")
public class MockDIYComponent implements IDIYComponent {
public class MockDIYComponent implements IDIYComponent<Object> {
private static final long serialVersionUID = 1L;
@@ -31,8 +29,8 @@ public class MockDIYComponent implements IDIYComponent {
private Point leftTopCorner = new Point(0, 0);
private String name = "something";
public MockDIYComponent(String testField, Capacitance c, Resistance r, Size s,
Color color, Point leftTopCorner) {
public MockDIYComponent(String testField, Capacitance c, Resistance r, Size s, Color color,
Point leftTopCorner) {
super();
this.testField = testField;
this.c = c;
@@ -55,13 +53,19 @@ public class MockDIYComponent implements IDIYComponent {
this.name = name;
}
@ControlPoint(visibilityPolicy = VisibilityPolicy.WHEN_SELECTED)
public Point getLeftTopCorner() {
@Override
public int getControlPointCount() {
return 1;
}
@Override
public Point getControlPoint(int index) {
return leftTopCorner;
}
public void setLeftTopCorner(Point leftTopCorner) {
this.leftTopCorner = leftTopCorner;
@Override
public void setControlPoint(Point point, int index) {
leftTopCorner.setLocation(point);
}
@EditableProperty(name = "Test Field")
@@ -1,120 +0,0 @@
package org.diylc.common;
import java.awt.Point;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.diylc.core.IDIYComponent;
import org.diylc.core.VisibilityPolicy;
/**
* Entity bean that represents a control point. Has methods for reading/writing
* {@link Point} value from/to a component.
*
* @author Branislav Stojkovic
*/
public class ControlPointWrapper {
private String name;
private Point value;
private Method setter;
private Method getter;
private boolean editable;
private boolean sticky;
private VisibilityPolicy visibilityPolicy;
public ControlPointWrapper(String name, Method getter, Method setter, boolean editable,
boolean sticky, VisibilityPolicy visibilityPolicy) {
super();
this.name = name;
this.getter = getter;
this.setter = setter;
this.editable = editable;
this.sticky = sticky;
this.visibilityPolicy = visibilityPolicy;
}
/**
* Reads value from the specified component by invoking it's
* <code>getter</code> method.
*
* @param component
* @throws IllegalArgumentException
* @throws IllegalAccessException
* @throws InvocationTargetException
*/
public void readFrom(IDIYComponent component) throws IllegalArgumentException,
IllegalAccessException, InvocationTargetException {
value = (Point) getter.invoke(component);
}
/**
* Writes the value into the specified component by invoking it's
* <code>setter</code> method.
*
* @param component
* @throws IllegalArgumentException
* @throws IllegalAccessException
* @throws InvocationTargetException
*/
public void writeTo(IDIYComponent component) throws IllegalArgumentException,
IllegalAccessException, InvocationTargetException {
setter.invoke(component, value);
}
public String getName() {
return name;
}
public boolean isEditable() {
return editable;
}
public boolean isSticky() {
return sticky;
}
public Point getValue() {
return value;
}
public void setValue(Point value) {
this.value = value;
}
public VisibilityPolicy getVisibilityPolicy() {
return visibilityPolicy;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + ((value == null) ? 0 : value.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ControlPointWrapper other = (ControlPointWrapper) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (value == null) {
if (other.value != null)
return false;
} else if (!value.equals(other.value))
return false;
return true;
}
}
@@ -1,10 +1,10 @@
package org.diylc.core;
import java.awt.Graphics2D;
import java.awt.Point;
import java.io.Serializable;
import org.diylc.core.annotations.ComponentDescriptor;
import org.diylc.core.annotations.ControlPoint;
import org.diylc.core.annotations.EditableProperty;
/**
@@ -16,7 +16,6 @@ import org.diylc.core.annotations.EditableProperty;
* <ul>
* <li>Must have an empty constructor.</li>
* <li>Class should be annotated with {@link ComponentDescriptor}.</li>
* <li>Control point getters need to be annotated with {@link ControlPoint}.</li>
* <li>Getters for properties editable by users should be annotated with
* {@link EditableProperty}.</li>
* <li>Component configuration should be stored int <code>public static</code>
@@ -36,6 +35,12 @@ public interface IDIYComponent<T> extends Serializable {
void setName(String name);
T getValue();
int getControlPointCount();
Point getControlPoint(int index);
void setControlPoint(Point point, int index);
/**
* Draws the component onto the {@link Graphics2D}.
@@ -1,40 +0,0 @@
package org.diylc.core.annotations;
import java.awt.Point;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import org.diylc.core.VisibilityPolicy;
/**
* Annotation for control points. This annotation may be added fields of type
* {@link Point} only when both getters and setters exist. Annotation is added
* always on the getter and it must return {@link Point} values.
*
* @author Branislav Stojkovic
*/
@Retention(RetentionPolicy.RUNTIME)
public @interface ControlPoint {
/**
* Determines when should the control point be rendered on the screen.
*
* @return
*/
VisibilityPolicy visibilityPolicy() default VisibilityPolicy.ALWAYS;
/**
* If true, application will allow the user to edit the control point.
*
* @return
*/
boolean editable() default true;
/**
* If true, the control point may be joined with other components' control
* points.
*
* @return
*/
boolean sticky() default true;
}
@@ -19,7 +19,6 @@ import javax.swing.SwingUtilities;
import org.diylc.common.BadPositionException;
import org.diylc.common.ComponentType;
import org.diylc.common.ControlPointWrapper;
import org.diylc.common.EventType;
import org.diylc.common.IPlugIn;
import org.diylc.common.IPlugInPort;
@@ -166,7 +165,7 @@ public class StatusBar extends JPanel implements IPlugIn {
break;
case AVAILABLE_CTRL_POINTS_CHANGED:
componentsUnderCursor = new ArrayList<IDIYComponent<?>>(
((Map<IDIYComponent<?>, ControlPointWrapper>) params[0]).keySet());
((Map<IDIYComponent<?>, Integer>) params[0]).keySet());
Collections.sort(componentsUnderCursor, ComparatorFactory.getInstance()
.getComponentNameComparator());
refreshStatusText();
@@ -1,6 +1,5 @@
package org.diylc.presenter;
import java.awt.Point;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
@@ -8,10 +7,8 @@ import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.diylc.common.ControlPointWrapper;
import org.diylc.common.PropertyWrapper;
import org.diylc.core.IDIYComponent;
import org.diylc.core.annotations.ControlPoint;
import org.diylc.core.annotations.EditableProperty;
import com.rits.cloning.Cloner;
@@ -28,7 +25,6 @@ public class ComponentProcessor {
private static ComponentProcessor instance;
private Map<Class<?>, List<PropertyWrapper>> propertyCache;
private Map<Class<?>, List<ControlPointWrapper>> controlPointCache;
private Cloner cloner;
@@ -43,7 +39,6 @@ public class ComponentProcessor {
super();
this.cloner = new Cloner();
this.propertyCache = new HashMap<Class<?>, List<PropertyWrapper>>();
this.controlPointCache = new HashMap<Class<?>, List<ControlPointWrapper>>();
}
/**
@@ -86,56 +81,14 @@ public class ComponentProcessor {
return cloner.deepClone(properties);
}
/**
* Reads all control points from the specified component class. Note than
* control points are cached, so it may happen that control points returned
* already have their values populated. Always use
* {@link ControlPointWrapper#readFrom(IDIYComponent)} to update their state
* from an actual component.
*
* @param clazz
* @return
*/
@SuppressWarnings("unchecked")
public List<ControlPointWrapper> extractControlPoints(Class<? extends IDIYComponent> clazz) {
if (controlPointCache.containsKey(clazz)) {
return cloner.deepClone(controlPointCache.get(clazz));
}
List<ControlPointWrapper> controlPoints = new ArrayList<ControlPointWrapper>();
for (Method method : clazz.getMethods()) {
if (method.getName().startsWith("get")) {
try {
Method setter = clazz.getMethod("set" + method.getName().substring(3), method
.getReturnType());
if (method.isAnnotationPresent(ControlPoint.class)) {
if (method.getReturnType().equals(Point.class)) {
ControlPoint annotation = method.getAnnotation(ControlPoint.class);
ControlPointWrapper controlPoint = new ControlPointWrapper(method
.getName().substring(3), method, setter, annotation.editable(),
annotation.sticky(), annotation.visibilityPolicy());
controlPoints.add(controlPoint);
} else {
LOG.debug("Control point return type must be java.awt.Point.");
}
}
} catch (NoSuchMethodException e) {
LOG.debug("No matching setter found for \"" + method.getName()
+ "\". Skipping...");
}
}
}
controlPointCache.put(clazz, controlPoints);
return cloner.deepClone(controlPoints);
}
/**
* Returns properties mutual for all the selected components.
*
* @param selectedComponents
* @return
*/
public List<PropertyWrapper> getMutualSelectionProperties(List<IDIYComponent<?>> selectedComponents) {
public List<PropertyWrapper> getMutualSelectionProperties(
List<IDIYComponent<?>> selectedComponents) {
if (selectedComponents.isEmpty()) {
return null;
}
@@ -22,7 +22,6 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import javax.swing.Action;
import javax.swing.Icon;
@@ -33,7 +32,6 @@ import org.apache.log4j.Logger;
import org.diylc.common.BadPositionException;
import org.diylc.common.ComponentSelection;
import org.diylc.common.ComponentType;
import org.diylc.common.ControlPointWrapper;
import org.diylc.common.DrawOption;
import org.diylc.common.EventType;
import org.diylc.common.IPlugIn;
@@ -43,7 +41,6 @@ import org.diylc.core.ComponentLayer;
import org.diylc.core.ComponentState;
import org.diylc.core.IDIYComponent;
import org.diylc.core.Project;
import org.diylc.core.VisibilityPolicy;
import org.diylc.core.annotations.ComponentDescriptor;
import org.diylc.gui.IView;
import org.diylc.utils.Constants;
@@ -79,7 +76,7 @@ public class Presenter implements IPlugInPort {
private ComponentSelection selectedComponents;
// List of components that have at least one of their control points
// under the last recorded mouse position.
private Map<IDIYComponent<?>, ControlPointWrapper> componentControlPointMap;
private Map<IDIYComponent<?>, Integer> componentControlPointMap;
private Cloner cloner;
@@ -322,16 +319,13 @@ public class Presenter implements IPlugInPort {
// Draw control points
if (drawOptions.contains(DrawOption.CONTROL_POINTS)) {
List<ControlPointWrapper> controlPoints = ComponentProcessor.getInstance()
.extractControlPoints(component.getClass());
for (ControlPointWrapper controlPoint : controlPoints) {
for (int i = 0; i < component.getControlPointCount(); i++) {
Point controlPoint = component.getControlPoint(i);
try {
controlPoint.readFrom(component);
if (shouldShowControlPoint(controlPoint, component)) {
if (shouldShowControlPointsFor(component)) {
g2d.setColor(Constants.CONTROL_POINT_COLOR);
g2d.setStroke(new BasicStroke(2));
g2d.drawOval(controlPoint.getValue().x - 2,
controlPoint.getValue().y - 2, 4, 4);
g2d.drawOval(controlPoint.x - 2, controlPoint.y - 2, 4, 4);
// g2d.fillOval(point.getValue().x - 2, point
// .getValue().y - 2, 5, 5);
}
@@ -439,17 +433,15 @@ public class Presenter implements IPlugInPort {
@Override
public void mouseMoved(Point point, boolean ctrlDown, boolean shiftDown, boolean altDown) {
Map<IDIYComponent<?>, ControlPointWrapper> components = new HashMap<IDIYComponent<?>, ControlPointWrapper>();
Map<IDIYComponent<?>, Integer> components = new HashMap<IDIYComponent<?>, Integer>();
Point scaledPoint = scalePoint(point);
for (IDIYComponent<?> component : currentProject.getComponents()) {
List<ControlPointWrapper> currentPoints = ComponentProcessor.getInstance()
.extractControlPoints(component.getClass());
for (ControlPointWrapper controlPoint : currentPoints) {
if (shouldShowControlPoint(controlPoint, component)) {
for (int i = 0; i < component.getControlPointCount(); i++) {
Point controlPoint = component.getControlPoint(i);
if (shouldShowControlPointsFor(component)) {
try {
controlPoint.readFrom(component);
if (scaledPoint.distance(controlPoint.getValue()) < CONTROL_POINT_SENSITIVITY) {
components.put(component, controlPoint);
if (scaledPoint.distance(controlPoint) < CONTROL_POINT_SENSITIVITY) {
components.put(component, i);
break;
}
} catch (Exception e) {
@@ -525,37 +517,21 @@ public class Presenter implements IPlugInPort {
if (!componentControlPointMap.isEmpty()) {
// We're dragging control point(s).
IDIYComponent<?> firstComponent = componentControlPointMap.keySet().iterator().next();
ControlPointWrapper controlPoint = componentControlPointMap.get(firstComponent);
Point controlPoint = firstComponent.getControlPoint(componentControlPointMap
.get(firstComponent));
if (controlPoint == null) {
LOG.warn("Control point not found in the map!");
}
// Re-read the value just in case.
try {
controlPoint.readFrom(firstComponent);
} catch (Exception e) {
e.printStackTrace();
}
int x = (int) (Math
.round((controlPoint.getValue().x + scaledPoint.x - previousDragPoint.x)
/ Constants.GRID) * Constants.GRID);
int y = (int) (Math
.round((controlPoint.getValue().y + scaledPoint.y - previousDragPoint.y)
/ Constants.GRID) * Constants.GRID);
int x = (int) (Math.round((controlPoint.x + scaledPoint.x - previousDragPoint.x)
/ Constants.GRID) * Constants.GRID);
int y = (int) (Math.round((controlPoint.y + scaledPoint.y - previousDragPoint.y)
/ Constants.GRID) * Constants.GRID);
previousDragPoint.setLocation(x, y);
for (Entry<IDIYComponent<?>, ControlPointWrapper> entry : componentControlPointMap
.entrySet()) {
try {
controlPoint = entry.getValue();
IDIYComponent<?> component = entry.getKey();
controlPoint.readFrom(component);
if (controlPoint.isEditable()) {
controlPoint.getValue().setLocation(x, y);
}
controlPoint.writeTo(component);
} catch (Exception e) {
}
// Update all points.
for (Map.Entry<IDIYComponent<?>, Integer> entry : componentControlPointMap.entrySet()) {
Point p = new Point(x, y);
entry.getKey().setControlPoint(p, entry.getValue());
}
// dragStartPoint = point;
} else if (selectedComponents.isEmpty()) {
@@ -616,26 +592,18 @@ public class Presenter implements IPlugInPort {
int dy = (int) (Math.round((toPoint.y - fromPoint.y) / zoomLevel / Constants.GRID) * Constants.GRID);
fromPoint.translate(dx, dy);
for (IDIYComponent<?> component : selectedComponents) {
List<ControlPointWrapper> controlPoints = ComponentProcessor.getInstance()
.extractControlPoints(component.getClass());
for (ControlPointWrapper controlPoint : controlPoints) {
try {
controlPoint.readFrom(component);
if (controlPoint.isEditable()) {
translateControlPoint(controlPoint, dx, dy);
}
controlPoint.writeTo(component);
} catch (Exception e) {
LOG.error("Could not translate control points: " + e.getMessage());
}
for (int i = 0; i < component.getControlPointCount(); i++) {
Point controlPoint = component.getControlPoint(i);
translateControlPoint(controlPoint, dx, dy);
component.setControlPoint(controlPoint, i);
}
}
}
private void translateControlPoint(ControlPointWrapper controlPoint, int dx, int dy) {
int x = controlPoint.getValue().x + dx;
int y = controlPoint.getValue().y + dy;
controlPoint.getValue().setLocation(x, y);
private void translateControlPoint(Point controlPoint, int dx, int dy) {
int x = controlPoint.x + dx;
int y = controlPoint.y + dy;
controlPoint.setLocation(x, y);
}
@Override
@@ -727,19 +695,16 @@ public class Presenter implements IPlugInPort {
// Add it to the project.
currentProject.getComponents().add(component);
// Extract control points.
List<ControlPointWrapper> controlPoints = ComponentProcessor.getInstance()
.extractControlPoints(componentClass);
// Translate them to the desired location.
if (point != null) {
for (ControlPointWrapper controlPoint : controlPoints) {
controlPoint.readFrom(component);
int x = controlPoint.getValue().x + point.x;
int y = controlPoint.getValue().y + point.y;
for (int j = 0; j < component.getControlPointCount(); j++) {
Point controlPoint = component.getControlPoint(j);
int x = controlPoint.x + point.x;
int y = controlPoint.y + point.y;
x = (int) (Math.round(x / Constants.GRID) * Constants.GRID);
y = (int) (Math.round(y / Constants.GRID) * Constants.GRID);
controlPoint.getValue().setLocation(x, y);
controlPoint.writeTo(component);
controlPoint.setLocation(x, y);
component.setControlPoint(controlPoint, j);
}
}
@@ -814,9 +779,13 @@ public class Presenter implements IPlugInPort {
(int) (point.y / zoomLevel));
}
private boolean shouldShowControlPoint(ControlPointWrapper controlPoint, IDIYComponent<?> component) {
return controlPoint.getVisibilityPolicy().equals(VisibilityPolicy.ALWAYS)
|| ((controlPoint.getVisibilityPolicy().equals(VisibilityPolicy.WHEN_SELECTED)) && (getSelectedComponents()
.contains(component)));
private boolean shouldShowControlPointsFor(IDIYComponent<?> component) {
return selectedComponents.contains(component);
// return
// controlPoint.getVisibilityPolicy().equals(VisibilityPolicy.ALWAYS)
// ||
// ((controlPoint.getVisibilityPolicy().equals(VisibilityPolicy.WHEN_SELECTED))
// && (getSelectedComponents()
// .contains(component)));
}
}
@@ -5,10 +5,8 @@ import static org.junit.Assert.assertNotNull;
import java.util.List;
import org.diylc.common.ControlPointWrapper;
import org.diylc.common.PropertyWrapper;
import org.diylc.components.MockDIYComponent;
import org.diylc.presenter.ComponentProcessor;
import org.junit.Test;
@@ -21,12 +19,4 @@ public class ClassProcessorTest {
assertNotNull(properties);
assertEquals(4, properties.size());
};
@Test
public void testExtractControlPoints() {
List<ControlPointWrapper> controlPoints = ComponentProcessor.getInstance()
.extractControlPoints(MockDIYComponent.class);
assertNotNull(controlPoints);
assertEquals(1, controlPoints.size());
};
}