Home | Changes | Index | Search | Go
Project Wonderland v0.5: Common API Patterns and Proposed API Simplification
by Jordan Slott (jslott@dev.java.net)
NOTE: This is a DRAFT. It is currently just a collection of ideas, and does not represent changes that may happen at all.
Introduction
Now that we have some experience using the core API in Project Wonderland 0.5, the following page summarizes some of the most common patterns and suggests ways in which these patterns may more easily be implemented in future versions. These API changes are meant to maintain compatibility with the 0.5 APIs: they simplify the most common API patterns for developers.
Client Message Receiver
Current API
@Override
public void setStatus(CellStatus status, boolean increasing) {
super.setStatus(status, increasing);
if (status == CellStatus.INACTIVE && increasing == false) {
ChannelComponent channel = getComponent(ChannelComponent.class);
channel.removeMessageReceiver(ShapeChangedCellMessage.class);
}
else if (status == CellStatus.RENDERING && increasing == true) {
ShapeCellMessageReceiver recv = new ShapeCellMessageReceiver();
ChannelComponent channel = getComponent(ChannelComponent.class);
channel.addMessageReceiver(ShapeChangedCellMessage.class, recv);
}
}
class ShapeCellMessageReceiver implements ComponentMessageReceiver {
public void messageReceived(CellMessage message) {
....
}
}
Proposed Future API
@MessageReceiver(ShapeChangedCellMessage.class)
public void messageReceived(ShapeChangedCellMessage msg) {
...
}
Server Message Receiver
Current API
@Override
protected void setLive(boolean live) {
super.setLive(live);
ChannelComponentMO channel = getComponent(ChannelComponentMO.class);
if (live == true) {
channel.addMessageReceiver(ShapeChangedCellMessage.class,
(ChannelComponentMO.ComponentMessageReceiver)new ShapeCellMessageReceiver(this));
}
else {
channel.removeMessageReceiver(ShapeChangedCellMessage.class);
}
}
private static class ShapeCellMessageReceiver extends AbstractComponentMessageReceiver {
public ShapeCellMessageReceiver(ShapeCellMO cellMO) {
super(cellMO);
}
public void messageReceived(WonderlandClientSender sender, WonderlandClientID clientID, CellMessage message) {
....
}
}
Proposed Future API
@MessageReceiver(ShapeChangedCellMessage.class)
public void messageReceived(WonderlandClientSender sender, WonderlandClientID clientID, CellMessage message) {
...
}
Event Listener
Current API
@Override
public void setStatus(CellStatus status, boolean increasing) {
super.setStatus(status, increasing);
if (status == CellStatus.INACTIVE && increasing == false) {
if (listener != null) {
listener.removeFromEntity(renderer.getEntity());
listener = null;
}
}
else if (status == CellStatus.RENDERING && increasing == true) {
if (listener == null) {
listener = new MouseEventListener();
listener.addToEntity(renderer.getEntity());
}
}
}
class MouseEventListener extends EventClassListener {
@Override
public Class[] eventClassesToConsume() {
return new Class[]{MouseButtonEvent3D.class};
}
@Override
public void commitEvent(Event event) {
...
}
}
Proposed Future API
@EventReceiver({ MouseButtonEvent3D.class })
public void eventReceived(MouseButtonEvent3D mbe) {
...
}
|