快速导航
从零开始学GeoServer源码一(开篇)
从零开始学GeoServer源码二(搭建开发环境)
从零开始学GeoServer源码三(断点应该打在哪?)
从零开始学GeoServer源码四(自定义插件或拓展数据源)
从零开始学GeoServer源码五(切片原理及自定义插件支持wms、wmts、tms)
从零开始学GeoServer源码六(如何打包发布?)
从零开始学GeoServer源码七(如何注册服务并发布3dtiles和cesium的地形terrain?)
从零开始学GeoServer源码八(内存溢出?Out of Memory Error ?)
从零开始学GeoServer源码九(如何集成Cesium以实现预览3dtiles和terrain服务?)
从零开始学GeoServer源码十(如何修改菜单项以整合我们的功能?)
从零开始学GeoServer源码十一(如何解决No Multipart-config for Servlet错误)
从零开始学GeoServer源码十二(GeoServer中的切片规则)
从零开始学GeoServer源码十三(GeoServer生成的矢量切片缺失问题)
从零开始学GeoServer源码十四(GeoServer Cloud微服务版本初体验)
前言: 上一篇我们讲了搭建开发环境,那这一篇就开始调试了。开始调试就有个问题,断点应该打在哪?这是我调试GeoServer源码的时候最头疼的一个问题。毕竟GeoServer这个工程下面的子工程还是蛮多的,所以这一篇,我们就来详细讲讲这个问题。
1.断点清单
首先,贴出一张我整理出来断点清单,然后我再来详细讲讲是怎么找到他们的。这个清单里,有的是最底层的方法,有的不是。但只要是这些功能,不出意外情况,都会在这些方法里进行调用。
序号 | 功能 | 所属包 | 路径 | 方法 |
---|---|---|---|---|
1 | 项目总入口 | gs-main | org/geoserver/filters/FlushSafeFilter.java | doFilter |
2 | 选择数据存储 | gs-web-core | org/geoserver/web/data/layer/NewLayerPage.java | resourceChooserLink |
3 | 点击发布按钮(数据存储页) | gs-web-core | org/geoserver/web/wicket/SimpleAjaxLink.java | onClick |
4 | 点击保存按钮(数据存储页) | gs-web-core | org/geoserver/web/publish/PublishedConfigurationPage.java | doSave |
5 | 获取数据库连接参数 | gs-web-core | org/geoserver/web/data/layer/NewLayerPage.java | buildLayerInfo |
6 | 创建图层的配置文件 | gs-web-core | org/geoserver/web/data/resource/ResourceConfigurationPage.java | doSaveInternal |
7 | 行列号及范围计算 | gwc-core.jar | GridSet.class | boundsFromIndex |
8 | 创建切片 | gwc-core.jar | ResponseUtil.class | writeData |
9 | 返回请求的切片数据 | gs-gwc | GwcServiceProxy.java | dispatch |
10 | 获取可用的栅格数据源 | gs-web-core | org/geoserver/web/data/store/NewDataPage.java | getAvailableCoverageStores |
11 | 获取mbtiles的连接参数 | gt-mbtiles.jar | MBTilesFile.class | MBTilesFile |
12 | 读取coverage | gs-main | src/main/java/org/geoserver/catalog/CatalogBuilder.java | getCoverageSampleDimensions |
13 | 从数据库获取服务元数据 | gt-mbtiles.jar | MBTilesReader.class | file.loadMetaData |
14 | 增删改服务的配置文件(工作区、数据存储、图层、样式等) | gs-main | src/main/java/org/geoserver/config/GeoServerConfigPersister.java | persist(修改,新增) rmRes(移除) |
15 | 创建TileLayer | gs-web-gwc | src/main/java/org/geoserver/gwc/web/layer/GeoServerTileLayerEditor.java | save |
16 | 验证发布服务的文件数据源(shape mbtiles image)是否正确 | gs-web-core | org/geoserver/web/wicket/FileExistsValidator.java | validate |
17 | 将切片保存在服务器某一路径下 | gwc-core.jar | org.geowebcache.layer.TileLayer.java | saveTiles |
18 | geoserver调用mbtiles的插件去读取数据 | gs-main | src/main/java/org/geoserver/catalog/CoverageDimensionCustomizerReader.java | read |
19 | 请求范围与切片对应范围进行对比 | gt-render.jar | org.geotools.renderer.lite.gridcoverage2d.GridCoverageRendererHelper.class | readCoverageInEnvelope |
20 | 将切片写入到流 | gs-gwc | org/geoserver/gwc/layer/GeoServerMetaTile.java | writeTileToStream |
21 | 根据请求的行列号计算切片所在的全路径 | gwc-core.jar | DefaultFilePathGenerator.class | tilePath |
2.授人以渔(怎么找的断点)
我是从索夫特威尔 的 这篇博文 中 找的灵感。他说访问wms服务的时候,会调用一个getmap接口,那就去源码里搜有没有getmap函数,果然搜到了,于是我就照猫画虎,找到getmap,打上断点,查看调用栈,顺藤摸瓜,找到了程序的总入口。
等等,有没有觉得这个FulshSafeFilter好熟悉,在哪里见过?对,在上一篇博文中设置允许GeoServer跨域访问的时候见过,去看下,果然找到了。
但是仅仅知道这个程序总入口,还是不够的,如果所有请求我们都通过总入口开始,F7一步一步向里走,那也太慢了。有没有快速一点的方法?有!我们以保存数据存储为例讲解。
提醒一下,GeoServer里一般的工作流程是:工作区(空间)->数据存储->图层->样式,当然样式和图层的顺序可以互换,对于没使用过GeoServer的计算机人员来说,这里可能稍微有点困惑。
当我们编辑一个数据存储的时候,点击保存以后,浏览器会发起一个请求,我们来看一下这个请求:
http://localhost:8090/geoserver/web/wicket/bookmarkable/org.geoserver.web.data.store.CoverageStoreEditPage?12-1.IBehaviorListener.0-rasterStoreForm-save & storeName=test & wsName=smartForest
很明显,这个是一个get请求,调用了CoverageStoreEditPage下的save方法,传了两个参数storeName和wsName,然后我们去源码里搜下有没有这个save方法,结果搜到很多的save方法,那没办法了,只能所有save方法都打上断点试试了,最后结果是,走的onSave方法。
3.总结
找断点基本上就这么几种方法了:
1.从主入口一步一步往里走
2.看浏览器的请求,然后再去找
3.猜,以上两种方法都不灵的时候,就只能猜了,只不过这个比较考验个人经验。
好了,本篇博文就讲到这了,下期再见。
更多精彩内容见公众号AIGIS