Author: simoneg
Date: Thu Dec 17 11:26:11 2009
New Revision: 891647

URL: http://svn.apache.org/viewvc?rev=891647&view=rev
Log:
LABS-503 : new map support bean

Added:
    labs/magma/trunk/beans-map/pom.xml
    labs/magma/trunk/beans-map/src/
    labs/magma/trunk/beans-map/src/main/
    labs/magma/trunk/beans-map/src/main/java/
    labs/magma/trunk/beans-map/src/main/java/org/
    labs/magma/trunk/beans-map/src/main/java/org/apache/
    labs/magma/trunk/beans-map/src/main/java/org/apache/magma/
    labs/magma/trunk/beans-map/src/main/java/org/apache/magma/beans/
    
labs/magma/trunk/beans-map/src/main/java/org/apache/magma/beans/MagMapBean.java
    
labs/magma/trunk/beans-map/src/main/java/org/apache/magma/beans/MapCoordinate.java
    
labs/magma/trunk/beans-map/src/main/java/org/apache/magma/beans/MapShape.java
    labs/magma/trunk/beans-map/src/main/java/org/apache/magma/conversion/
    labs/magma/trunk/beans-map/src/main/java/org/apache/magma/conversion/map/
    
labs/magma/trunk/beans-map/src/main/java/org/apache/magma/conversion/map/MapBeanToStringConverter.java
    labs/magma/trunk/beans-map/src/main/java/org/apache/magma/validation/
    
labs/magma/trunk/beans-map/src/main/java/org/apache/magma/validation/validators/
    
labs/magma/trunk/beans-map/src/main/java/org/apache/magma/validation/validators/InferConsiderOnMagMapValidated.aj
    
labs/magma/trunk/beans-map/src/main/java/org/apache/magma/validation/validators/MagMap.java
    
labs/magma/trunk/beans-map/src/main/java/org/apache/magma/validation/validators/MapBeanValidator.java
    labs/magma/trunk/beans-map/src/main/resources/
    labs/magma/trunk/beans-map/src/main/resources/META-INF/
    
labs/magma/trunk/beans-map/src/main/resources/META-INF/magma.default.properties
    labs/magma/trunk/beans-map/src/test/
    labs/magma/trunk/beans-map/src/test/java/
    labs/magma/trunk/beans-map/src/test/resources/

Added: labs/magma/trunk/beans-map/pom.xml
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/beans-map/pom.xml?rev=891647&view=auto
==============================================================================
--- labs/magma/trunk/beans-map/pom.xml (added)
+++ labs/magma/trunk/beans-map/pom.xml Thu Dec 17 11:26:11 2009
@@ -0,0 +1,25 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/maven-v4_0_0.xsd";>
+  <parent>
+    <artifactId>magma-parent</artifactId>
+    <groupId>org.apache.magma</groupId>
+    <version>3</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.apache.magma</groupId>
+  <artifactId>beans-map</artifactId>
+  <name>Magma Beans Map</name>
+  <version>0.0.3-SNAPSHOT</version>
+  <packaging>magma</packaging>  
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.magma</groupId>
+      <artifactId>foundation-beans</artifactId>
+      <version>0.0.3-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.magma</groupId>
+      <artifactId>foundation-validation</artifactId>
+      <version>0.0.3-SNAPSHOT</version>
+    </dependency>
+  </dependencies>
+</project>
\ No newline at end of file

Added: 
labs/magma/trunk/beans-map/src/main/java/org/apache/magma/beans/MagMapBean.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/beans-map/src/main/java/org/apache/magma/beans/MagMapBean.java?rev=891647&view=auto
==============================================================================
--- 
labs/magma/trunk/beans-map/src/main/java/org/apache/magma/beans/MagMapBean.java 
(added)
+++ 
labs/magma/trunk/beans-map/src/main/java/org/apache/magma/beans/MagMapBean.java 
Thu Dec 17 11:26:11 2009
@@ -0,0 +1,123 @@
+package org.apache.magma.beans;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.lang.builder.HashCodeBuilder;
+
+/**
+ * Holder for geographic coordinates.
+ * 
+ * This type can contain not only a pair of coordinates,
+ * but a full range of geographic data.
+ * 
+ * It contains groups of points (markers), shapes (lines or polygons) and
+ * routes (points connected using existing streets).
+ * 
+ * This data can be contained in a single string. In that case,
+ * the format is as follows :
+ * <ul>
+ *     <li>Each shape is a string is followed by the ">" character</li>
+ *  <li>The shape string is subdivided in parts, using the "!" character</li>
+ *  <li>The first part is the preambol, and contains only the type, which can 
be "point", "line", "poly" or "route"</li>
+ *  <li>The second part are the coordinates, subdivided by ";", and in the 
format long,lat where long and lat are floating point numbers, eventually 
negative, using "." as the decimal separator.</li>
+ *  <li>The third part is optional, currently used only by the route type. For 
routes it contains the polyline for the route, as returned by the underlying 
map system.</li>
+ * </ul>
+ * 
+ *
+ * @author Simone Gianni <[email protected]>
+ */
+public class MagMapBean {
+
+       /**
+        * The stringified value of all the shapes in this map.
+        */
+       private String value;
+       /**
+        * Becomes true is this map is modified, to avoid reserialization of 
data from the converter
+        */
+       private boolean modified = false;
+       
+       /**
+        * Optional center of the map, if not specified map will be designed to 
contain all shapes.
+        */
+       private MapCoordinate center = null;
+       /**
+        * Optional map scale, in pixel per meter, if not specified map will be 
designed to contain all shapes.
+        */
+       private int ppm = 0;
+       
+       /**
+        * Shapes in this map.
+        */
+       private List<MapShape> shapes = null;
+       
+       
+       public String getValue() {
+               if (this.modified) serialize();
+               return value;
+       }
+
+       public void setValue(String value) {
+               this.value = value;
+       }
+       
+       public void parse() {
+               this.modified = false;
+               if (this.value == null) return;
+               this.shapes = new ArrayList<MapShape>();
+               String[] shapeStrings = this.value.split(">");
+               for (String shapestr : shapeStrings) {
+                       MapShape sh = new MapShape();
+                       sh.parse(shapestr);
+                       this.shapes.add(sh);
+               }
+       }
+       
+       public void serialize() {
+               this.modified = false;
+               this.value = "";
+               if (this.shapes == null) return;
+               for (MapShape shape : this.shapes) {
+                       this.value += shape.serialize();
+                       this.value += ">";
+               }
+       }
+       
+       public void addShape(MapShape shape) {
+               this.modified = true;
+               if (this.shapes == null) parse();
+               if (this.shapes == null) this.shapes = new 
ArrayList<MapShape>();
+               this.shapes.add(shape);
+       }
+
+       public List<MapShape> getShapes() {
+               if (this.shapes == null) parse();
+               return shapes;
+       }
+       public void setShapes(List<MapShape> shapes) {
+               this.modified = true;           
+               this.shapes = shapes;
+       }
+       
+       public List<MapShape> findShapes(String type) {
+               if (this.shapes == null) parse();
+               List<MapShape> ret = new ArrayList<MapShape>();
+               if (this.shapes == null) return ret;
+               for (MapShape mapShape : this.shapes) {
+                       if (mapShape.getType().equals(type)) ret.add(mapShape);
+               }
+               return ret;             
+       }
+
+       @Override
+       public int hashCode() {
+               return new HashCodeBuilder(51, 15)
+                       .append(this.center)
+                       .append(this.ppm)
+                       .append(this.getValue())
+                       .toHashCode();
+       }
+       
+       
+}

Added: 
labs/magma/trunk/beans-map/src/main/java/org/apache/magma/beans/MapCoordinate.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/beans-map/src/main/java/org/apache/magma/beans/MapCoordinate.java?rev=891647&view=auto
==============================================================================
--- 
labs/magma/trunk/beans-map/src/main/java/org/apache/magma/beans/MapCoordinate.java
 (added)
+++ 
labs/magma/trunk/beans-map/src/main/java/org/apache/magma/beans/MapCoordinate.java
 Thu Dec 17 11:26:11 2009
@@ -0,0 +1,30 @@
+package org.apache.magma.beans;
+
+public class MapCoordinate {
+
+       private float latitude;
+       private float longitude;
+       
+       
+       public float getLatitude() {
+               return latitude;
+       }
+       public void setLatitude(float latitude) {
+               this.latitude = latitude;
+       }
+       public float getLongitude() {
+               return longitude;
+       }
+       public void setLongitude(float longitude) {
+               this.longitude = longitude;
+       }
+       public void parse(String string) {
+               String[] split = string.split(",");
+               this.latitude = Float.parseFloat(split[0]);
+               this.longitude = Float.parseFloat(split[1]);
+       }
+       public String serialize() {
+               return Float.toString(this.latitude) + "," + 
Float.toString(this.longitude);
+       }
+       
+}

Added: 
labs/magma/trunk/beans-map/src/main/java/org/apache/magma/beans/MapShape.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/beans-map/src/main/java/org/apache/magma/beans/MapShape.java?rev=891647&view=auto
==============================================================================
--- 
labs/magma/trunk/beans-map/src/main/java/org/apache/magma/beans/MapShape.java 
(added)
+++ 
labs/magma/trunk/beans-map/src/main/java/org/apache/magma/beans/MapShape.java 
Thu Dec 17 11:26:11 2009
@@ -0,0 +1,84 @@
+package org.apache.magma.beans;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class MapShape {
+
+       public static String 
+       TYPE_POINT = "point",
+       TYPE_LINE = "line",
+       TYPE_POLY = "poly",
+       TYPE_ROUTE = "route";
+       
+       private String type;
+       private List<MapCoordinate> coordinates = new 
ArrayList<MapCoordinate>();
+       private String extra;
+
+       public String getType() {
+               return type;
+       }
+       public void setType(String type) {
+               this.type = type;
+       }
+       
+       public void addCoordinates(MapCoordinate... coordinates) {
+               for (MapCoordinate coord : coordinates) {
+                       this.coordinates.add(coord);
+               }
+       }
+
+       public List<MapCoordinate> getCoordinates() {
+               return coordinates;
+       }
+       public void setCoordinates(List<MapCoordinate> coordinates) {
+               this.coordinates = coordinates;
+       }
+       public String getExtra() {
+               return extra;
+       }
+       public void setExtra(String extra) {
+               this.extra = extra;
+       }
+       public void parse(String shapestr) {
+               this.coordinates.clear();
+               String[] parts = shapestr.split("\\!");
+               this.type = parts[0];
+               if (parts.length > 1) {
+                       this.parseCoordinates(parts[1]);
+               }
+               if (parts.length > 2) {
+                       this.extra = parts[2];
+               }
+       }
+       private void parseCoordinates(String string) {
+               if (string.length() == 0) return;
+               String[] split = string.split(";");
+               for (String coordstr : split) {
+                       if (coordstr.length() == 0) continue;
+                       MapCoordinate coord = new MapCoordinate();
+                       coord.parse(string);
+                       this.coordinates.add(coord);
+               }
+       }
+       public String serialize() {
+               StringBuilder ret = new StringBuilder();
+               ret.append(this.type);
+               ret.append('!');
+               if (this.coordinates != null) {
+                       for (MapCoordinate coord : this.coordinates) {
+                               ret.append(coord.serialize());
+                               ret.append(';');
+                       }
+               }
+               ret.append('!');
+               if (this.extra != null) {
+                       ret.append(this.extra);
+               }
+               return ret.toString();
+       }
+       
+       
+       
+       
+}

Added: 
labs/magma/trunk/beans-map/src/main/java/org/apache/magma/conversion/map/MapBeanToStringConverter.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/beans-map/src/main/java/org/apache/magma/conversion/map/MapBeanToStringConverter.java?rev=891647&view=auto
==============================================================================
--- 
labs/magma/trunk/beans-map/src/main/java/org/apache/magma/conversion/map/MapBeanToStringConverter.java
 (added)
+++ 
labs/magma/trunk/beans-map/src/main/java/org/apache/magma/conversion/map/MapBeanToStringConverter.java
 Thu Dec 17 11:26:11 2009
@@ -0,0 +1,40 @@
+package org.apache.magma.conversion.map;
+
+import org.apache.magma.beans.MagMapBean;
+import org.apache.magma.beans.PropertyInfo;
+import org.apache.magma.conversion.Converter;
+import org.apache.magma.conversion.PropertyAwareConverter;
+import org.apache.magma.conversion.string.BaseConverter;
+
+public class MapBeanToStringConverter extends BaseConverter<MagMapBean> 
implements PropertyAwareConverter {
+
+
+       public MapBeanToStringConverter() {
+               super(MagMapBean.class);
+       }
+
+       /**
+        * Always returns a new instance, cause being a {...@link 
PropertyAwareConverter} means this class is not thread safe. 
+        */
+       @Override
+       public Converter<MagMapBean> build(Class<? extends MagMapBean> clazz) {
+               return new MapBeanToStringConverter();
+       }
+
+       public MagMapBean from(String value) {
+               if (value == null) return null;
+               MagMapBean map = new MagMapBean();
+               map.setValue(value);
+               return map;
+       }
+
+       public int getMaximumStringSize() {
+               return -1;
+       }
+
+       public String to(MagMapBean value) {
+               if (value == null) return null;
+               return value.getValue();
+       }
+
+}

Added: 
labs/magma/trunk/beans-map/src/main/java/org/apache/magma/validation/validators/InferConsiderOnMagMapValidated.aj
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/beans-map/src/main/java/org/apache/magma/validation/validators/InferConsiderOnMagMapValidated.aj?rev=891647&view=auto
==============================================================================
--- 
labs/magma/trunk/beans-map/src/main/java/org/apache/magma/validation/validators/InferConsiderOnMagMapValidated.aj
 (added)
+++ 
labs/magma/trunk/beans-map/src/main/java/org/apache/magma/validation/validators/InferConsiderOnMagMapValidated.aj
 Thu Dec 17 11:26:11 2009
@@ -0,0 +1,13 @@
+package org.apache.magma.validation.validators;
+
+import org.apache.magma.beans.Consider;
+import org.apache.magma.beans.MagMapBean;
+import org.apache.magma.beans.MagmaBeanSupport;
+
+public aspect InferConsiderOnMagMapValidated {
+
+       // TODO worked around for AspectJ bug
+       declare @method : (@MagMap !...@consider public * 
org.apache.magma.beans.*agmaBeanSupport+.get*()) : @Consider(MagMapBean.class);
+       declare @method : (@MagMap !...@consider public void 
org.apache.magma.beans.*agmaBeanSupport+.set*(..)) : 
@Consider(MagMapBean.class);
+       
+}

Added: 
labs/magma/trunk/beans-map/src/main/java/org/apache/magma/validation/validators/MagMap.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/beans-map/src/main/java/org/apache/magma/validation/validators/MagMap.java?rev=891647&view=auto
==============================================================================
--- 
labs/magma/trunk/beans-map/src/main/java/org/apache/magma/validation/validators/MagMap.java
 (added)
+++ 
labs/magma/trunk/beans-map/src/main/java/org/apache/magma/validation/validators/MagMap.java
 Thu Dec 17 11:26:11 2009
@@ -0,0 +1,21 @@
+package org.apache.magma.validation.validators;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.apache.magma.validation.ValidationAnnotation;
+
+...@validationannotation
+...@target(ElementType.METHOD)
+...@retention(RetentionPolicy.RUNTIME)
+public @interface MagMap {
+
+       public boolean permitMarkers() default true;
+       public boolean permitLines() default true;
+       public boolean permitPolygons() default true;
+       public boolean permitRoutes() default true;
+       public int maxShapes() default Integer.MAX_VALUE;
+       
+}

Added: 
labs/magma/trunk/beans-map/src/main/java/org/apache/magma/validation/validators/MapBeanValidator.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/beans-map/src/main/java/org/apache/magma/validation/validators/MapBeanValidator.java?rev=891647&view=auto
==============================================================================
--- 
labs/magma/trunk/beans-map/src/main/java/org/apache/magma/validation/validators/MapBeanValidator.java
 (added)
+++ 
labs/magma/trunk/beans-map/src/main/java/org/apache/magma/validation/validators/MapBeanValidator.java
 Thu Dec 17 11:26:11 2009
@@ -0,0 +1,84 @@
+package org.apache.magma.validation.validators;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.magma.basics.LocalizableString;
+import org.apache.magma.beans.MagMapBean;
+import org.apache.magma.beans.MapShape;
+import org.apache.magma.beans.PropertyInfo;
+import org.apache.magma.validation.Validator;
+
+public class MapBeanValidator implements Validator<MagMapBean>{
+
+       private boolean permitMarkers = true;
+       private boolean permitLines = true;
+       private boolean permitPolygons = true;
+       private boolean permitRoutes = true;
+       private int maxShapes = Integer.MAX_VALUE;
+       
+       
+       public int maxCharacterLength() {
+               return -1;
+       }
+
+       
+       
+       public List<LocalizableString> validate(Object bean, PropertyInfo 
property, MagMapBean value) {
+               if (value == null) return null;
+               List<LocalizableString> ret = new 
ArrayList<LocalizableString>();
+               if (!permitMarkers) ret = check(value, MapShape.TYPE_POINT, 
"points", ret);
+               if (!permitLines) ret = check(value, MapShape.TYPE_LINE, 
"lines", ret);
+               if (!permitPolygons) ret = check(value, MapShape.TYPE_POLY, 
"polygons", ret);
+               if (!permitRoutes) ret = check(value, MapShape.TYPE_ROUTE, 
"routes", ret);
+               if (maxShapes != Integer.MAX_VALUE) {
+                       if (maxShapes < value.getShapes().size()) {
+                               ret.add(new LocalizableString("You are limited 
to {0} elements in this map", maxShapes));
+                       }
+               }
+               return ret;
+       }
+       
+       protected List<LocalizableString> check(MagMapBean value, String type, 
String name, List<LocalizableString> ret) {
+               if (value.findShapes(type).size() > 0) {
+                       ret.add(new LocalizableString("You cannot use " + name 
+ " in this map"));
+               }               
+               return ret;
+       }
+
+       public boolean isPermitMarkers() {
+               return permitMarkers;
+       }
+       public void setPermitMarkers(boolean permitMarkers) {
+               this.permitMarkers = permitMarkers;
+       }
+
+       public boolean isPermitLines() {
+               return permitLines;
+       }
+       public void setPermitLines(boolean permitLines) {
+               this.permitLines = permitLines;
+       }
+
+       public boolean isPermitPolygons() {
+               return permitPolygons;
+       }
+       public void setPermitPolygons(boolean permitPolygons) {
+               this.permitPolygons = permitPolygons;
+       }
+
+       public boolean isPermitRoutes() {
+               return permitRoutes;
+       }
+       public void setPermitRoutes(boolean permitRoutes) {
+               this.permitRoutes = permitRoutes;
+       }
+
+       public int getMaxShapes() {
+               return maxShapes;
+       }
+       public void setMaxShapes(int maxShapes) {
+               this.maxShapes = maxShapes;
+       }
+
+}

Added: 
labs/magma/trunk/beans-map/src/main/resources/META-INF/magma.default.properties
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/beans-map/src/main/resources/META-INF/magma.default.properties?rev=891647&view=auto
==============================================================================
--- 
labs/magma/trunk/beans-map/src/main/resources/META-INF/magma.default.properties 
(added)
+++ 
labs/magma/trunk/beans-map/src/main/resources/META-INF/magma.default.properties 
Thu Dec 17 11:26:11 2009
@@ -0,0 +1,16 @@
+#Licensed to the Apache Software Foundation (ASF) under one or more
+#contributor license agreements.  See the NOTICE file distributed with
+#this work for additional information regarding copyright ownership.
+#The ASF licenses this file to You under the Apache License, Version 2.0
+#(the "License"); you may not use this file except in compliance with
+#the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+#Unless required by applicable law or agreed to in writing, software
+#distributed under the License is distributed on an "AS IS" BASIS,
+#WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#See the License for the specific language governing permissions and
+#limitations under the License.
+
+org.apache.magma.conversion.Converter.map=org.apache.magma.conversion.map.MapBeanToStringConverter



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to