Registro de operaciones
Este documento explica cómo registrar una nueva operación asociada a una geometría
Para poder utilizar una operación esta ha tenido que ser registrada previamente. Si se intenta ejecutar una operación que no haya sido registrada mediante el GeometryManager, se obtendrá una exceptión.
El registro de operaciones se debe hacer en una clase que extienda de GeometryLibrary, concretamente en el método postinitialice. El método registerGeometryOperation es el encargado de registrar una operación. Las operaciones se tienen que registrar asociadas a un tipo concreto de geometría (o a más de un tipo) de modo que pueden haber operaciones que sólo sean válidas para un subconjunto de geometrías.
Por ejemplo, la operación PrintLn del apartado anterior se puede ejecutar sobre todos los tipos de geometrías. Para que esto sea así, hay que registrarla del siguiente modo:
GeometryManager geometryManager = GeometryLocator.getGeometryManager();
geometryManager.registerOperation("PrintLn", printLn);
El método registerOperation acepta dos parámetros: primero está el nombre de la operación y segundo está el objeto que implementa la operación. En este caso se está registrando la operación de dibujado por la salida estándar y se está asociando a todos los tipos de geometrías.
Existe un mecanismo para registrar operaciones asociadas a un tipo de geometría concreta. Podemos por ejemplo crear una operación PrintLn que únicamente sea capaz de escribir por pantalla puntos en 2 dimensiones. La operación sería la siguiente:
public class printLnPoint2D extends GeometryOperation {
public static final String NAME = "println";
public static final int CODE = GeometryLocator.getGeometryManager().getGeometryOperationCode(NAME);
public int getOperationIndex() {
return CODE;
}
public Object invoke(Geometry geom, GeometryOperationContext ctx) throws GeometryOperationException {
Point point = (Point)geom;
System.out.println("Point 2D, X=" + point.getX() + " Y=" + point.getY());
return null;
}
}
Esta operación sólo sabe manejar objetos de tipo Point en 2 dimensiones, por lo que en el método registerOperation de registro se tienen que especificar dos nuevos parámetros con el tipo y el subtipo de la geometría sobre la que se aplica esta operación. Cuando se invoque la operación PrintLn", se ejecutará el código de la operación "PrintLn" para todos los tipos de geomtría menos para el *Point en 2 dimensiones, que ejecutará el código de la operación específica.
GeometryManager geometryManager = GeometryLocator.getGeometryManager();
geometryManager.registerOperation("PrintLn", printLnPoint2D, Geometry.TYPES.Point, Geometry.SUBTYPES.GEOM2D);
Existe otra sobrecarga del método registerOperation que permite asociar una operación a todas las geometrías de un tipo determinado (con independencia del subtipo). Un ejemplo podría ser la siguiente operación que imprime por pantalla cualquier tipo de punto, independientemente de su dimensión.
public class printLnPoint extends GeometryOperation {
public static final String NAME = "println";
public static final int CODE = GeometryLocator.getGeometryManager().getGeometryOperationCode(NAME);
public int getOperationIndex() {
return CODE;
}
public Object invoke(Geometry geom, GeometryOperationContext ctx) throws GeometryOperationException {
Point point = (Point)geom;
System.out.println("Point, ");
for (int i=0 ; i<point.getDimension() ; i++){
System.out.println("Coordinate i =" + point.getCoordinateAt(i));
}
return null;
}
}
Para registrar esta operación, hay que ejecutar el siguiente código:
GeometryManager geometryManager = GeometryLocator.getGeometryManager();
geometryManager.registerOperation("PrintLn", printLnPoint, Geometry.TYPES.Point);
Y la última opeción es la de registrar una operación para todas las geometrías de un mismo subtipo. El ejemplo más claro de esta operación es la operación de dibujado en 2D, que es capaz de dibujar todas las geoemtrías en 2 Dimensiones. Para poder registrar esta operación hay que ejecutar el siguiente código:
geometryManager.registerOperationBySubtype("Draw2D", draw2D, Geometry.SUBTYPES.GEOM2D);