/webportal/src/main/java/org/ala/spatial/analysis/web/AreaUploadShapefile.java

http://alageospatialportal.googlecode.com/ · Java · 364 lines · 284 code · 45 blank · 35 comment · 57 complexity · 599afb2e948f1976ab2f40016e71d571 MD5 · raw file

  1. package org.ala.spatial.analysis.web;
  2. import au.org.emii.portal.composer.MapComposer;
  3. import au.org.emii.portal.menu.MapLayer;
  4. import au.org.emii.portal.menu.MapLayerMetadata;
  5. import java.io.BufferedReader;
  6. import java.io.BufferedWriter;
  7. import java.io.File;
  8. import java.io.FileWriter;
  9. import java.io.InputStream;
  10. import java.io.InputStreamReader;
  11. import java.io.PrintWriter;
  12. import java.io.Reader;
  13. import java.io.StringReader;
  14. import java.io.StringWriter;
  15. import java.io.Writer;
  16. import java.util.Map;
  17. import org.ala.spatial.util.ShapefileUtils;
  18. import org.ala.spatial.util.Zipper;
  19. import org.zkoss.util.media.Media;
  20. import org.zkoss.zk.ui.event.Event;
  21. import org.zkoss.zk.ui.event.EventListener;
  22. import org.zkoss.zk.ui.event.ForwardEvent;
  23. import org.zkoss.zk.ui.event.UploadEvent;
  24. import org.zkoss.zul.Textbox;
  25. import com.vividsolutions.jts.geom.Geometry;
  26. import com.vividsolutions.jts.io.WKTWriter;
  27. import java.util.Collection;
  28. import java.util.HashMap;
  29. import java.util.zip.ZipEntry;
  30. import java.util.zip.ZipInputStream;
  31. import org.ala.spatial.util.UserData;
  32. import org.apache.commons.httpclient.HttpClient;
  33. import org.apache.commons.httpclient.UsernamePasswordCredentials;
  34. import org.apache.commons.httpclient.auth.AuthScope;
  35. import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
  36. import org.apache.commons.httpclient.methods.PutMethod;
  37. import org.apache.commons.httpclient.methods.RequestEntity;
  38. import org.geotools.kml.KMLConfiguration;
  39. import org.geotools.xml.Parser;
  40. import org.opengis.feature.simple.SimpleFeature;
  41. import org.zkoss.zk.ui.Executions;
  42. import org.zkoss.zk.ui.SuspendNotAllowedException;
  43. import org.zkoss.zul.Button;
  44. import org.zkoss.zul.Window;
  45. /**
  46. *
  47. * @author Adam
  48. */
  49. public class AreaUploadShapefile extends AreaToolComposer {
  50. //Fileupload fileUpload;
  51. Button fileUpload;
  52. Textbox txtLayerName;
  53. @Override
  54. public void afterCompose() {
  55. super.afterCompose();
  56. txtLayerName.setValue(getMapComposer().getNextAreaLayerName("My Area"));
  57. fileUpload.addEventListener("onUpload", new EventListener() {
  58. public void onEvent(Event event) throws Exception {
  59. onClick$btnOk(event);
  60. }
  61. });
  62. }
  63. public void onClick$btnOk(Event event) {
  64. onUpload$btnFileUpload(event);
  65. this.detach();
  66. }
  67. public void onClick$btnCancel(Event event) {
  68. this.detach();
  69. }
  70. public void onUpload$btnFileUpload(Event event) {
  71. //UploadEvent ue = (UploadEvent) ((ForwardEvent) event).getOrigin();
  72. UploadEvent ue = null;
  73. if (event.getName().equals("onUpload")) {
  74. ue = (UploadEvent) event;
  75. } else if (event.getName().equals("onForward")) {
  76. ue = (UploadEvent) ((ForwardEvent) event).getOrigin();
  77. }
  78. if (ue == null) {
  79. System.out.println("unable to upload file");
  80. return;
  81. } else {
  82. System.out.println("fileUploaded()");
  83. }
  84. try {
  85. Media m = ue.getMedia();
  86. System.out.println("m.getName(): " + m.getName());
  87. System.out.println("getContentType: " + m.getContentType());
  88. System.out.println("getFormat: " + m.getFormat());
  89. // check the content-type
  90. // if (m.getContentType().equalsIgnoreCase("text/plain") || m.getContentType().equalsIgnoreCase(LayersUtil.LAYER_TYPE_CSV) || m.getContentType().equalsIgnoreCase(LayersUtil.LAYER_TYPE_CSV_EXCEL)) {
  91. // loadUserPoints(m.getName(), m.getReaderData());
  92. // } else if (m.getContentType().equalsIgnoreCase(LayersUtil.LAYER_TYPE_EXCEL)) {
  93. // byte[] csvdata = m.getByteData();
  94. // loadUserPoints(m.getName(), new StringReader(new String(csvdata)));
  95. // } else
  96. // if (m.getContentType().equalsIgnoreCase(LayersUtil.LAYER_TYPE_KML)) {
  97. // System.out.println("isBin: " + m.isBinary());
  98. // System.out.println("inMem: " + m.inMemory());
  99. // if (m.inMemory()) {
  100. // loadUserLayerKML(m.getName(), m.getByteData());
  101. // } else {
  102. // loadUserLayerKML(m.getName(), m.getStreamData());
  103. // }
  104. // }
  105. UserData ud = new UserData(txtLayerName.getValue());
  106. ud.setFilename(m.getName());
  107. byte[] kmldata = getKml(m);
  108. if (kmldata != null) {
  109. loadUserLayerKML(m.getName(), kmldata, ud);
  110. //} else if (m.getName().equalsIgnoreCase("MEOW2.zip") || m.getName().equalsIgnoreCase("singlepolygon.zip")) {
  111. } else if (m.getName().toLowerCase().endsWith("zip")) {
  112. Map args = new HashMap();
  113. args.put("layername", txtLayerName.getValue());
  114. args.put("media", m);
  115. Window window = (Window) Executions.createComponents("WEB-INF/zul/AreaUploadShapefileWizard.zul", this.getParent(), args);
  116. try {
  117. window.doModal();
  118. } catch (SuspendNotAllowedException e) {
  119. // we are really closing the window without opening/displaying to the user
  120. }
  121. } else if (m.getName().toLowerCase().endsWith("zip_removeme")) { //else if (m.getContentType().equalsIgnoreCase(LayersUtil.LAYER_TYPE_ZIP)) {
  122. // "/data/ala/runtime/output/layers/"
  123. // "/Users/ajay/projects/tmp/useruploads/"
  124. Map input = Zipper.unzipFile(m.getName(), m.getStreamData(), "/data/ala/runtime/output/layers/");
  125. String type = "";
  126. String file = "";
  127. if (input.containsKey("type")) {
  128. type = (String) input.get("type");
  129. }
  130. if (input.containsKey("file")) {
  131. file = (String) input.get("file");
  132. }
  133. if (type.equalsIgnoreCase("shp")) {
  134. System.out.println("Uploaded file is a shapefile. Loading...");
  135. Map shape = ShapefileUtils.loadShapefile(new File(file));
  136. if (shape == null) {
  137. return;
  138. } else {
  139. String wkt = (String) shape.get("wkt");
  140. //wkt = wkt.replace("MULTIPOLYGON (((", "POLYGON((").replaceAll(", ", ",").replace(")))", "))");
  141. System.out.println("Got shapefile wkt...");
  142. //String layerName = getMapComposer().getNextAreaLayerName(txtLayerName.getValue());
  143. layerName = txtLayerName.getValue();
  144. MapLayer mapLayer = getMapComposer().addWKTLayer(wkt, layerName, layerName);
  145. mapLayer.setMapLayerMetadata(new MapLayerMetadata());
  146. //mapLayer.getMapLayerMetadata().setMoreInfo("User uploaded shapefile. \n Used polygon: " + shape.get("id"));
  147. //mapLayer.getMapLayerMetadata().setMoreInfo("User uploaded shapefile.");
  148. ud.setUploadedTimeInMs(System.currentTimeMillis());
  149. ud.setType("shapefile");
  150. String metadata = "";
  151. metadata += "User uploaded Shapefile \n";
  152. metadata += "Name: " + ud.getName() + " <br />\n";
  153. metadata += "Filename: " + ud.getFilename() + " <br />\n";
  154. metadata += "Date: " + ud.getDisplayTime() + " <br />\n";
  155. MapLayerMetadata mlmd = mapLayer.getMapLayerMetadata();
  156. if (mlmd == null) {
  157. mlmd = new MapLayerMetadata();
  158. }
  159. mlmd.setMoreInfo(metadata);
  160. mapLayer.setMapLayerMetadata(mlmd);
  161. ok = true;
  162. }
  163. } else {
  164. System.out.println("Unknown file type. ");
  165. getMapComposer().showMessage("Unknown file type. Please upload a valid CSV, \nKML or Shapefile. ");
  166. }
  167. } else {
  168. System.out.println("Unknown file type. ");
  169. getMapComposer().showMessage("Unknown file type. Please upload a valid CSV, \nKML or Shapefile. ");
  170. }
  171. } catch (Exception ex) {
  172. getMapComposer().showMessage("Unable to load file. Please try again. ");
  173. ex.printStackTrace();
  174. }
  175. }
  176. private byte[] getKml(Media m) {
  177. try {
  178. String kmlData = "";
  179. if (m.inMemory()) {
  180. kmlData = new String(m.getByteData());
  181. } else if (m.isBinary()) {
  182. InputStream data = m.getStreamData();
  183. if (data != null) {
  184. Writer writer = new StringWriter();
  185. char[] buffer = new char[1024];
  186. try {
  187. Reader reader = new BufferedReader(
  188. new InputStreamReader(data));
  189. int n;
  190. while ((n = reader.read(buffer)) != -1) {
  191. writer.write(buffer, 0, n);
  192. }
  193. } finally {
  194. data.close();
  195. }
  196. kmlData = writer.toString();
  197. }
  198. } else if ("txt".equals(m.getFormat())) {
  199. Writer writer = new StringWriter();
  200. char[] buffer = new char[1024];
  201. try {
  202. Reader reader = m.getReaderData();
  203. int n;
  204. while ((n = reader.read(buffer)) != -1) {
  205. writer.write(buffer, 0, n);
  206. }
  207. } finally {
  208. }
  209. kmlData = writer.toString();
  210. }
  211. if (kmlData.contains("xml") && kmlData.contains("Document")) { // kmlData.contains("kml") &&
  212. return kmlData.getBytes();
  213. } else {
  214. return null;
  215. }
  216. } catch (Exception e) {
  217. System.out.println("Exception checking if kml file");
  218. e.printStackTrace(System.out);
  219. }
  220. return null;
  221. }
  222. public void loadUserLayerKML(String name, InputStream data, UserData ud) {
  223. try {
  224. String kmlData = "";
  225. if (data != null) {
  226. Writer writer = new StringWriter();
  227. char[] buffer = new char[1024];
  228. try {
  229. Reader reader = new BufferedReader(
  230. new InputStreamReader(data));
  231. int n;
  232. while ((n = reader.read(buffer)) != -1) {
  233. writer.write(buffer, 0, n);
  234. }
  235. } finally {
  236. data.close();
  237. }
  238. kmlData = writer.toString();
  239. }
  240. loadUserLayerKML(name, kmlData.getBytes(), ud);
  241. } catch (Exception e) {
  242. getMapComposer().showMessage("Unable to load your file. Please try again.");
  243. System.out.println("unable to load user kml: ");
  244. e.printStackTrace(System.out);
  245. }
  246. }
  247. public void loadUserLayerKML(String name, byte[] kmldata, UserData ud) {
  248. try {
  249. String id = String.valueOf(System.currentTimeMillis());
  250. String kmlpath = "/data/ala/runtime/output/layers/" + id + "/";
  251. File kmlfilepath = new File(kmlpath);
  252. kmlfilepath.mkdirs();
  253. PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(kmlfilepath.getAbsolutePath() + "/" + name)));
  254. String kmlstr = new String(kmldata);
  255. out.write(kmlstr);
  256. out.close();
  257. MapComposer mc = getMapComposer();
  258. layerName = (mc.getMapLayer(txtLayerName.getValue()) == null) ? txtLayerName.getValue() : mc.getNextAreaLayerName(txtLayerName.getValue());
  259. String wkt = getKMLPolygonAsWKT(kmlstr);
  260. MapLayer mapLayer = mc.addWKTLayer(wkt, layerName, txtLayerName.getValue());
  261. ud.setUploadedTimeInMs(Long.parseLong(id));
  262. ud.setType("kml");
  263. String metadata = "";
  264. metadata += "User uploaded KML area \n";
  265. metadata += "Name: " + ud.getName() + " <br />\n";
  266. metadata += "Filename: " + ud.getFilename() + " <br />\n";
  267. metadata += "Date: " + ud.getDisplayTime() + " <br />\n";
  268. MapLayerMetadata mlmd = mapLayer.getMapLayerMetadata();
  269. if (mlmd == null) {
  270. mlmd = new MapLayerMetadata();
  271. }
  272. mlmd.setMoreInfo(metadata);
  273. mapLayer.setMapLayerMetadata(mlmd);
  274. if (mapLayer == null) {
  275. logger.debug("The layer " + name + " couldnt be created");
  276. mc.showMessage(mc.getLanguagePack().getLang("ext_layer_creation_failure"));
  277. } else {
  278. ok = true;
  279. //this.layerName = mapLayer.getName();
  280. //String kmlwkt = getKMLPolygonAsWKT(kmlstr);
  281. //mapLayer.setWKT(kmlwkt);
  282. mc.addUserDefinedLayerToMenu(mapLayer, true);
  283. }
  284. } catch (Exception e) {
  285. getMapComposer().showMessage("Unable to load your file. Please try again.");
  286. System.out.println("unable to load user kml: ");
  287. e.printStackTrace(System.out);
  288. }
  289. }
  290. private static String getKMLPolygonAsWKT(String kmldata) {
  291. try {
  292. Parser parser = new Parser(new KMLConfiguration());
  293. SimpleFeature f = (SimpleFeature) parser.parse(new StringReader(kmldata));
  294. Collection placemarks = (Collection) f.getAttribute("Feature");
  295. Geometry g = null;
  296. SimpleFeature sf = null;
  297. //for <Placemark>
  298. if (placemarks.size() > 0 && placemarks.size() > 0) {
  299. sf = (SimpleFeature) placemarks.iterator().next();
  300. g = (Geometry) sf.getAttribute("Geometry");
  301. }
  302. //for <Folder><Placemark>
  303. if (g == null && sf != null) {
  304. placemarks = (Collection) sf.getAttribute("Feature");
  305. if (placemarks != null && placemarks.size() > 0) {
  306. g = (Geometry) ((SimpleFeature) placemarks.iterator().next()).getAttribute("Geometry");
  307. }
  308. }
  309. if (g != null) {
  310. WKTWriter wr = new WKTWriter();
  311. String wkt = wr.write(g);
  312. return wkt.replace(" (", "(").replace(", ", ",").replace(") ", ")");
  313. }
  314. } catch (Exception e) {
  315. e.printStackTrace(System.out);
  316. }
  317. return null;
  318. }
  319. }