Commit 145f1026 authored by Benedikt Zoennchen's avatar Benedikt Zoennchen

Merge branch 'remove_reflection' into 'develop'

Remove reflection where reasonable; closes #91 and fixes #86

See merge request !28
parents d7f24dfa 4a1d1bf3
Pipeline #59611 passed with stage
in 48 seconds
......@@ -145,7 +145,7 @@ public class ScenarioElementView extends JPanel implements ISelectScenarioElemen
} else {
try {
Attributes attributes = StateJsonConverter.deserializeScenarioElementType(json, element.getType());
ReflectionAttributeModifier.setAttributes(element, attributes);
element.setAttributes(attributes); // Replaces previous AttributeModifier.setAttributes (see #91)
ScenarioPanel.removeJsonParsingErrorMsg();
ProjectView.getMainWindow().refreshScenarioNames();
jsonValidIndicator.setValid();
......@@ -186,8 +186,8 @@ public class ScenarioElementView extends JPanel implements ISelectScenarioElemen
} else if (scenarioElement instanceof Pedestrian) {
this.txtrTextfiletextarea.setText(StateJsonConverter.serializeObject(scenarioElement));
} else {
this.txtrTextfiletextarea.setText(StateJsonConverter
.serializeObject(ReflectionAttributeModifier.getAttributes(scenarioElement)));
this.txtrTextfiletextarea.setText(StateJsonConverter
.serializeObject(scenarioElement.getAttributes()));
}
}
}
......
......@@ -3,18 +3,20 @@ package org.vadere.gui.topographycreator.control;
import java.lang.reflect.Field;
import org.vadere.gui.topographycreator.model.AgentWrapper;
import org.vadere.simulator.projects.Scenario;
import org.vadere.state.attributes.Attributes;
import org.vadere.state.attributes.AttributesEmbedShape;
import org.vadere.state.scenario.ScenarioElement;
import org.vadere.util.geometry.shapes.VPoint;
import org.vadere.util.geometry.shapes.VShape;
/**
* Setter and getter implementation to modify Attributes. This class uses use of reflection.
* Setter implementation to modify shape of Attributes.
* Do not use this class outside of the topographycreator package, or even not outside this
* control-package!
*
*
*/
public class ReflectionAttributeModifier {
public class AttributeModifier {
/**
* Sets the shape to the attributes of an topography element. Use this method only in the
* control!
......@@ -24,19 +26,15 @@ public class ReflectionAttributeModifier {
*/
static void setShapeToAttributes(final ScenarioElement element, final VShape shape) {
try {
Field field;
if (element instanceof AgentWrapper) {
double x = shape.getBounds2D().getCenterX();
double y = shape.getBounds2D().getCenterY();
((AgentWrapper) element).getAgentInitialStore().setPosition(new VPoint(x, y));
} else {
Attributes attributes =
org.vadere.simulator.entrypoints.ReflectionAttributeModifier.getAttributes(element);
field = attributes.getClass().getDeclaredField("shape");
field.setAccessible(true);
field.set(attributes, shape);
AttributesEmbedShape attributes = (AttributesEmbedShape) element.getAttributes();
attributes.setShape(shape);
}
} catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
} catch (ClassCastException e) {
e.printStackTrace();
}
}
......
......@@ -26,14 +26,14 @@ public class EditUpdateElementShape extends AbstractUndoableEdit {
@Override
public void undo() throws CannotUndoException {
ReflectionAttributeModifier.setShapeToAttributes(element, oldShape);
AttributeModifier.setShapeToAttributes(element, oldShape);
panelModel.setSelectedElement(element);
panelModel.notifyObservers();
}
@Override
public void redo() throws CannotRedoException {
ReflectionAttributeModifier.setShapeToAttributes(element, newShape);
AttributeModifier.setShapeToAttributes(element, newShape);
panelModel.setSelectedElement(element);
panelModel.notifyObservers();
}
......
......@@ -77,7 +77,7 @@ public class SelectElementMode extends DefaultSelectionMode {
VShape newShape =
panelModel.translate(new Point(e.getPoint().x - startPoint.x, e.getPoint().y - startPoint.y));
ReflectionAttributeModifier.setShapeToAttributes(element, newShape);
AttributeModifier.setShapeToAttributes(element, newShape);
// tell the panelModel that the selected element has changed!
panelModel.setSelectedElement(element);
......
......@@ -71,6 +71,11 @@ public final class AgentWrapper extends ScenarioElement {
return agent.getAttributes();
}
@Override
public void setAttributes(Attributes attributes){
this.agent.setAttributes(attributes);
}
@Override
public AgentWrapper clone() {
return new AgentWrapper((Agent) agent.clone());
......
......@@ -252,7 +252,12 @@ public class ScenarioBuilder {
AttributesBuilder<Attributes> attBuilder = new AttributesBuilder<>(element.getAttributes());
attBuilder.setField(fieldName, value);
E clone = (E) element.clone();
reflectionAttributeModifier.setAttributes(clone, attBuilder.build());
//NOTE see issue #91:
//This class is not tested - revert change by uncommenting reflextion and comment in
//clone.setAttributes
//reflectionAttributeModifier.setAttributes(clone, attBuilder.build());
clone.setAttributes(attBuilder.build());
return clone;
}
......
package org.vadere.state.attributes;
import org.vadere.util.geometry.shapes.VShape;
/**
* Abstract Base Class for {@link Attributes} that also consist of a {@link VShape}. The shape can be changed and
* 'undo' and 'redo' operations can be carried out in EditUpdateElementShape in package
* org.vadere.gui.topographycreator.control.
*/
public abstract class AttributesEmbedShape extends Attributes {
public abstract void setShape(VShape shape);
public abstract VShape getShape();
}
package org.vadere.state.attributes.scenario;
import org.vadere.state.attributes.Attributes;
import org.vadere.state.attributes.AttributesEmbedShape;
import org.vadere.util.geometry.shapes.VShape;
public class AttributesObstacle extends Attributes {
public class AttributesObstacle extends AttributesEmbedShape {
private VShape shape;
private int id;
......@@ -19,10 +19,12 @@ public class AttributesObstacle extends Attributes {
this.shape = shape;
}
@Override
public void setShape(VShape shape) {
this.shape = shape;
}
@Override
public VShape getShape() {
return shape;
}
......
......@@ -4,12 +4,12 @@ import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import org.vadere.state.attributes.Attributes;
import org.vadere.state.attributes.AttributesEmbedShape;
import org.vadere.state.scenario.ConstantDistribution;
import org.vadere.state.types.DynamicElementType;
import org.vadere.util.geometry.shapes.VShape;
public class AttributesSource extends Attributes {
public class AttributesSource extends AttributesEmbedShape {
public static final String CONSTANT_DISTRIBUTION = ConstantDistribution.class.getName();
public static final int NO_MAX_SPAWN_NUMBER_TOTAL = -1;
......@@ -123,10 +123,12 @@ public class AttributesSource extends Attributes {
return id;
}
@Override
public void setShape(VShape shape) {
this.shape = shape;
}
@Override
public VShape getShape() {
return shape;
}
......
......@@ -2,6 +2,7 @@ package org.vadere.state.attributes.scenario;
import org.apache.log4j.Logger;
import org.vadere.state.attributes.Attributes;
import org.vadere.state.attributes.AttributesEmbedShape;
import org.vadere.state.scenario.Stairs;
import org.vadere.util.geometry.Vector2D;
import org.vadere.util.geometry.shapes.VShape;
......@@ -16,7 +17,7 @@ import org.vadere.util.geometry.shapes.VShape;
*
*
*/
public class AttributesStairs extends Attributes {
public class AttributesStairs extends AttributesEmbedShape {
private VShape shape = null;
private int id = ID_NOT_SET;
......@@ -42,10 +43,12 @@ public class AttributesStairs extends Attributes {
}
}
@Override
public void setShape(VShape shape) {
this.shape = shape;
}
@Override
public VShape getShape() {
return shape;
}
......
package org.vadere.state.attributes.scenario;
import org.vadere.state.attributes.Attributes;
import org.vadere.state.attributes.AttributesEmbedShape;
import org.vadere.state.scenario.Pedestrian;
import org.vadere.util.geometry.shapes.VShape;
......@@ -8,7 +9,7 @@ import org.vadere.util.geometry.shapes.VShape;
* Attributes of a target area, used by TargetController in VadereSimulation.
*
*/
public class AttributesTarget extends Attributes {
public class AttributesTarget extends AttributesEmbedShape {
private int id = ID_NOT_SET;
/**
......@@ -99,10 +100,12 @@ public class AttributesTarget extends Attributes {
return id;
}
@Override
public void setShape(VShape shape) {
this.shape = shape;
}
@Override
public VShape getShape() {
return shape;
}
......
......@@ -7,6 +7,7 @@ import java.util.Random;
import org.apache.commons.math3.random.JDKRandomGenerator;
import org.apache.commons.math3.random.RandomGenerator;
import org.vadere.state.attributes.Attributes;
import org.vadere.state.attributes.scenario.AttributesAgent;
import org.vadere.util.geometry.Vector2D;
import org.vadere.util.geometry.shapes.VCircle;
......@@ -31,7 +32,7 @@ public abstract class Agent extends DynamicElement {
private double freeFlowSpeed;
private final AttributesAgent attributes;
private AttributesAgent attributes;
public Agent(AttributesAgent attributesAgent) {
position = new VPoint(0, 0);
......@@ -184,6 +185,11 @@ public abstract class Agent extends DynamicElement {
// Setters...
@Override
public void setAttributes(Attributes attributes){
this.attributes = (AttributesAgent) attributes;
}
/**
* Set the index pointing to the next target in the target list.
*
......
......@@ -2,6 +2,7 @@ package org.vadere.state.scenario;
import java.util.Random;
import org.vadere.state.attributes.Attributes;
import org.vadere.state.attributes.scenario.AttributesCar;
import org.vadere.state.types.ScenarioElementType;
import org.vadere.util.geometry.Vector2D;
......@@ -11,7 +12,7 @@ import org.vadere.util.geometry.shapes.VRectangle;
public class Car extends Agent implements Comparable<Car> {
private final AttributesCar attributesCar;
private AttributesCar attributesCar;
public Car(AttributesCar attributesCar, Random random) {
super(attributesCar, random);
......@@ -63,6 +64,10 @@ public class Car extends Agent implements Comparable<Car> {
return this.attributesCar;
}
public void setAttributes(Attributes attributes) {
this.attributesCar = (AttributesCar) attributes;
}
@Override
public int getId() {
return attributesCar.getId();
......
package org.vadere.state.scenario;
import org.vadere.state.attributes.Attributes;
import org.vadere.state.attributes.scenario.AttributesAgent;
import org.vadere.state.attributes.scenario.AttributesObstacle;
import org.vadere.state.types.ScenarioElementType;
import org.vadere.util.geometry.shapes.VShape;
public class Obstacle extends ScenarioElement {
private final AttributesObstacle attributes;
private AttributesObstacle attributes;
public Obstacle(AttributesObstacle attributes) {
if (attributes == null)
......@@ -71,6 +72,12 @@ public class Obstacle extends ScenarioElement {
return attributes;
}
@Override
public void setAttributes(Attributes attributes){
this.attributes = (AttributesObstacle) attributes;
}
@Override
public Obstacle clone() {
return new Obstacle((AttributesObstacle) attributes.clone());
......
......@@ -25,4 +25,7 @@ public abstract class ScenarioElement {
public abstract ScenarioElement clone();
public abstract Attributes getAttributes();
public abstract void setAttributes(Attributes attributes);
}
package org.vadere.state.scenario;
import org.vadere.state.attributes.Attributes;
import org.vadere.state.attributes.scenario.AttributesSource;
import org.vadere.state.types.ScenarioElementType;
import org.vadere.util.geometry.shapes.VShape;
public class Source extends ScenarioElement {
private final AttributesSource attributes;
private AttributesSource attributes;
public Source(AttributesSource attributes) {
this.attributes = attributes;
......@@ -32,6 +33,13 @@ public class Source extends ScenarioElement {
return attributes;
}
@Override
public void setAttributes(Attributes attributes){
this.attributes = (AttributesSource) attributes;
}
public double getStartTime() {
return attributes.getStartTime();
}
......
......@@ -5,8 +5,10 @@ import java.awt.geom.Path2D;
import java.awt.geom.PathIterator;
import java.awt.geom.Rectangle2D;
import org.vadere.state.attributes.Attributes;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.vadere.state.attributes.scenario.AttributesStairs;
import org.vadere.state.types.ScenarioElementType;
import org.vadere.util.geometry.shapes.VLine;
......@@ -25,17 +27,15 @@ public class Stairs extends ScenarioElement {
}
}
private final AttributesStairs attributes;
private final Tread[] treads;
private AttributesStairs attributes;
private Tread[] treads;
private double treadDepth;
public Stairs(AttributesStairs attributes) {
this.attributes = attributes;
treads = initializeTreads();
setAttributes(attributes);
}
private Tread[] initializeTreads() {
private Tread[] computeTreads() {
// tread count + 2 since the first and last treads must be placed outside of the shape and
// on the next floor.
Tread[] treadsResult = new Tread[this.getAttributes().getTreadCount() + 2];
......@@ -76,6 +76,12 @@ public class Stairs extends ScenarioElement {
return treadsResult;
}
@Override
public void setAttributes(Attributes attributes) {
this.attributes = (AttributesStairs) attributes;
treads = computeTreads();
}
@Override
public void setShape(VShape newShape) {
attributes.setShape(newShape);
......
......@@ -6,13 +6,14 @@ import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import org.vadere.state.attributes.Attributes;
import org.vadere.state.attributes.scenario.AttributesTarget;
import org.vadere.state.types.ScenarioElementType;
import org.vadere.util.geometry.shapes.VShape;
public class Target extends ScenarioElement implements Comparable<Target> {
private final AttributesTarget attributes;
private AttributesTarget attributes;
private final Map<Integer, Double> enteringTimes;
/**
......@@ -113,6 +114,13 @@ public class Target extends ScenarioElement implements Comparable<Target> {
return attributes;
}
@Override
public void setAttributes(Attributes attributes){
this.attributes = (AttributesTarget) attributes;
}
/** Is this target actually a pedestrian? @see scenario.TargetPedestrian */
public boolean isTargetPedestrian() {
return false;
......
package org.vadere.state.scenario;
import org.vadere.state.attributes.Attributes;
import org.vadere.state.attributes.scenario.AttributesTeleporter;
import org.vadere.state.types.ScenarioElementType;
import org.vadere.util.geometry.Vector2D;
......@@ -8,7 +9,7 @@ import org.vadere.util.geometry.shapes.VShape;
public class Teleporter extends ScenarioElement {
private final AttributesTeleporter attributes;
private AttributesTeleporter attributes;
public Teleporter(AttributesTeleporter attributes) {
this.attributes = attributes;
......@@ -37,6 +38,11 @@ public class Teleporter extends ScenarioElement {
return attributes;
}
@Override
public void setAttributes(Attributes attributes) {
this.attributes = (AttributesTeleporter) attributes;
}
@Override
public ScenarioElementType getType() {
return ScenarioElementType.TELEPORTER;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment