package org.vaadin.hezamu.googlemapwidget.overlay; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import org.vaadin.hezamu.googlemapwidget.GoogleMap; public class BasicMarkerSource implements MarkerSource, Serializable { private static final long serialVersionUID = -803448463650898130L; private final List<Marker> markers = new ArrayList<Marker>(); public List<Marker> getMarkers() { return markers; } public boolean addMarker(Marker newMarker) { if (markers.contains(newMarker)) { return false; } markers.add(newMarker); return true; } public byte[] getMarkerJSON() { // 1000 markers, using String concatenation: 8100ms // using StringBuilder: 17ms :) StringBuilder markerJSON = new StringBuilder(); for (int i = 0; i < markers.size(); i++) { Marker marker = markers.get(i); markerJSON.append("{\"mid\":\"").append(marker.getId()); markerJSON.append("\",\"lat\":").append(marker.getLatLng().y); markerJSON.append(",\"lng\":").append(marker.getLatLng().x); // Escape single and double quotes markerJSON.append(",\"title\":\"").append( marker.getTitle().replaceAll("'", "\'") .replaceAll("\"", "\\\\\"")); markerJSON.append("\",\"visible\":").append(marker.isVisible()); markerJSON.append(",\"info\":").append( marker.getInfoWindowContent() != null); markerJSON.append(",\"draggable\":").append(marker.isDraggable()); if (marker.getIconUrl() != null) { markerJSON.append(",\"icon\":\"").append( marker.getIconUrl() + "\""); if (marker.getIconAnchor() != null) { markerJSON.append(",\"iconAnchorX\":").append( marker.getIconAnchor().x); markerJSON.append(",\"iconAnchorY\":").append( marker.getIconAnchor().y); } else { markerJSON.append(",\"iconAnchorX\":").append( marker.getLatLng().x); markerJSON.append(",\"iconAnchorY\":").append( marker.getLatLng().y); } } markerJSON.append("}"); if (i != markers.size() - 1) { markerJSON.append(","); } } try { return ("[" + markerJSON + "]").getBytes("UTF-8"); } catch (Exception e) { return ("[" + markerJSON + "]").getBytes(); } } public void registerEvents(GoogleMap map) { // This marker source implementation is not interested in map events } public Marker getMarker(String markerId) { // TODO The marker collection should be a map... for (Marker marker : markers) { if (marker.getId().toString().equals(markerId)) { return marker; } } return null; } }