从零开始学GeoServer源码三(断点应该打在哪?)

快速导航

从零开始学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微服务版本初体验)

点我去AIGIS公众号查看本文

前言: 上一篇我们讲了搭建开发环境,那这一篇就开始调试了。开始调试就有个问题,断点应该打在哪?这是我调试GeoServer源码的时候最头疼的一个问题。毕竟GeoServer这个工程下面的子工程还是蛮多的,所以这一篇,我们就来详细讲讲这个问题。

1.断点清单

  首先,贴出一张我整理出来断点清单,然后我再来详细讲讲是怎么找到他们的。这个清单里,有的是最底层的方法,有的不是。但只要是这些功能,不出意外情况,都会在这些方法里进行调用。

序号功能所属包路径方法
1项目总入口gs-mainorg/geoserver/filters/FlushSafeFilter.javadoFilter
2选择数据存储gs-web-coreorg/geoserver/web/data/layer/NewLayerPage.javaresourceChooserLink
3点击发布按钮(数据存储页)gs-web-coreorg/geoserver/web/wicket/SimpleAjaxLink.javaonClick
4点击保存按钮(数据存储页)gs-web-coreorg/geoserver/web/publish/PublishedConfigurationPage.javadoSave
5获取数据库连接参数gs-web-coreorg/geoserver/web/data/layer/NewLayerPage.javabuildLayerInfo
6创建图层的配置文件gs-web-coreorg/geoserver/web/data/resource/ResourceConfigurationPage.javadoSaveInternal
7行列号及范围计算gwc-core.jarGridSet.classboundsFromIndex
8创建切片gwc-core.jarResponseUtil.classwriteData
9返回请求的切片数据gs-gwcGwcServiceProxy.javadispatch
10获取可用的栅格数据源gs-web-coreorg/geoserver/web/data/store/NewDataPage.javagetAvailableCoverageStores
11获取mbtiles的连接参数gt-mbtiles.jarMBTilesFile.classMBTilesFile
12读取coveragegs-mainsrc/main/java/org/geoserver/catalog/CatalogBuilder.javagetCoverageSampleDimensions
13从数据库获取服务元数据gt-mbtiles.jarMBTilesReader.classfile.loadMetaData
14增删改服务的配置文件(工作区、数据存储、图层、样式等)gs-mainsrc/main/java/org/geoserver/config/GeoServerConfigPersister.javapersist(修改,新增) rmRes(移除)
15创建TileLayergs-web-gwcsrc/main/java/org/geoserver/gwc/web/layer/GeoServerTileLayerEditor.javasave
16验证发布服务的文件数据源(shape mbtiles image)是否正确gs-web-coreorg/geoserver/web/wicket/FileExistsValidator.javavalidate
17将切片保存在服务器某一路径下gwc-core.jarorg.geowebcache.layer.TileLayer.javasaveTiles
18geoserver调用mbtiles的插件去读取数据gs-mainsrc/main/java/org/geoserver/catalog/CoverageDimensionCustomizerReader.javaread
19请求范围与切片对应范围进行对比gt-render.jarorg.geotools.renderer.lite.gridcoverage2d.GridCoverageRendererHelper.classreadCoverageInEnvelope
20将切片写入到流gs-gwcorg/geoserver/gwc/layer/GeoServerMetaTile.javawriteTileToStream
21根据请求的行列号计算切片所在的全路径gwc-core.jarDefaultFilePathGenerator.classtilePath

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方法,传了两个参数storeNamewsName,然后我们去源码里搜下有没有这个save方法,结果搜到很多的save方法,那没办法了,只能所有save方法都打上断点试试了,最后结果是,走的onSave方法。
在这里插入图片描述

3.总结

  找断点基本上就这么几种方法了:
  1.从主入口一步一步往里走
  2.看浏览器的请求,然后再去找
  3.猜,以上两种方法都不灵的时候,就只能猜了,只不过这个比较考验个人经验。
  好了,本篇博文就讲到这了,下期再见。
更多精彩内容见公众号AIGIS

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AIGIS.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值