系列文章目录
Geoserver源码解读一 环境搭建
Geoserver源码解读二 主入口
Geoserver源码解读三 GeoServerBasePage
Geoserver源码解读四 REST服务
Geoserver源码解读五 Catalog
Geoserver源码解读六 插件(怎么在开发模式下使用)
目录
系列文章目录
前言
一、源码位置
二、开发模式下怎么使用
三、文件资源管理插件(Resource Browser Tool)
1.概览
2.支持多文件上传
2.1 改动一
2.2 改动二
2.3 改动三
2.4 改动四
3.国际化i18n配置
3.1 第一步 新建GeoServerApplication_zh.properties资源包
3.2 第二步 翻译并转成 ISO-8859 编码
前言
看这篇文章的人相信肯定已经知道geoserver的插件大致有哪些,实用的有哪些,我就不再多说了。简单附上一个插件的下载地址(传送门)。
因为geoserver官方社区给出的插件有很多,此处就不一一说明,这篇文章主要记录下插件的源码位置在哪和怎么在开发模式下使用插件以及以文件资源管理插件为例分析下改造的一个过程。
一、源码位置
从源码中能看到有一个【extension】文件夹(这点儿我还是比较意外的,插件的源码竟然也在源码里面,本来我还以为是另外一个需要单独下载的工程)
默认情况下它是没有蓝色小方块的,只有当你用到它时idea才会加一个蓝色小方块的标识。
二、开发模式下怎么使用
geoserver官方社区的插件在使用的时候,一般都是下载下来插件,然后放到geoserver安装目录的lib文件夹下,然后重启geoserver就行,但是在开发模式下怎么安装插件呢。
常规的思路是在主模块gs-web-app里面引用extension的下面的插件子模块应该可以了,但是我又在 pom.xml文件里发现了一些关于插件的profiles设置
于是乎,打开了maven的设置面板,勾选上想要使用的插件,再点击下刷新按钮就可以了
三、文件资源管理插件(Resource Browser Tool)
1.概览
在maven的配置界面勾选上后,重启geoserver就能在浏览器界面中看到它了
没有做过i18n处理的小伙伴看到的估计名字是【Resource Browser】,这个后面再讲,这个文件资源管理器有个缺点,就是每次上传文件的时候只能上传一个,如果要想上传一个shp文件到服务器就废老劲了,咱们稍微改造下它,让它支持多文件上传
2.支持多文件上传
看过上面第一段的描述后可以看出来它的源码位置在这个地方
src/extension/web-resource
2.1 改动一
看过我前面文章的朋友们应该也知道,geoserver是基于Wicket做的,这个文件资源管理器也是一样的,先找到它的html页面
src/main/resources/org/geoserver/web/resources/PanelUpload.html
这个地方做第一个小改动
<input wicket:id="file" size="40" type="file" multiple>
在input标签上加一个multiple
2.2 改动二
在它的java类上添加查询上传的文件列表方法
org/geoserver/web/resources/PanelUpload.java
/**
* 获取上传的文件列表
* @return List<FileUpload>
*/
public List<FileUpload> getFileUploadList() {
return ((FileUploadField) get("file")).getFileUploads();
}
2.3 改动三
在资源浏览器类中加获取上传的文件资源列表方法
org/geoserver/web/resources/PageResourceBrowser.java
/**
* 获取文件上传组件的文件列表
* @param uploadPanel 文件上传组件
* @return List<Resource>
*/
private List<Resource> getUploadPanelResourceList(PanelUpload uploadPanel) {
String dir = uploadPanel.getDirectory();
List<Resource> uploadPanelResourceList = new ArrayList<>();
uploadPanel.getFileUploadList().forEach(singleFileUpload->{
uploadPanelResourceList.add(store().get(Paths.path(dir, singleFileUpload.getClientFileName())));
});
return uploadPanelResourceList;
}
2.4 改动四
在PageResourceBrowser类的上传按钮的提交事件回调中加处理方法
@Override
protected boolean onSubmit(AjaxRequestTarget target, Component contents) {
uploadPanel.getFeedbackMessages().clear();
if (uploadPanel.getFileUpload() == null) {
uploadPanel.error(
new ParamResourceModel("fileRequired", getPage())
.getString());
} else {
List<Resource> uploadPanelResourceList = getUploadPanelResourceList(uploadPanel);
AtomicInteger successNumber = new AtomicInteger();
uploadPanelResourceList.forEach(singleResource->{
if (Resources.exists(singleResource)) {
uploadPanel.error(
new ParamResourceModel("resourceExists", getPage())
.getString()
.replace("%", "/" + singleResource.path()));
} else {
try (OutputStream os = singleResource.out()) {
IOUtils.copy(
uploadPanel.getFileUpload().getInputStream(), os);
treeView.setSelectedNode(
new ResourceNode(singleResource, expandedStates), target);
successNumber.getAndIncrement();
// return true;
} catch (IOException | IllegalStateException e) {
uploadPanel.error(e.getMessage());
}
}
});
if(successNumber.get() == uploadPanelResourceList.size()){
return true;
}
}
target.add(uploadPanel.getFeedbackPanel());
return false;
}
到这儿这个功能就完成了,可以看到下面的多选文件的效果
3.国际化i18n配置
关于i18n,geoserver官方也给出了一些描述
Translating GeoServer — GeoServer 2.25.x Developer Manual
我们就按照它官网的说明来(不配置也没关系,只不过默认显示的文字是英文)
3.1 第一步 新建GeoServerApplication_zh.properties资源包
从上图能看出来,这个插件默认只有德、法、韩等一些小国家的兼容,没有中文的,所以有必要让它兼容下中文,文件的内容可以拷贝GeoServerApplication.properties
3.2 第二步 翻译并转成 ISO-8859 编码
以插件的title为例在GeoServerApplication.properties中看到下面的描述
PageResourceBrowser.page.title=Resource Browser
翻译成中文是
PageResourceBrowser.page.title=文件资源管理器
但是GeoServerApplication.properties默认是不认中文的,只能用ISO-8859编码,所有要再做一个转换,网上在线转换的网址有很多,比如这个(传送门)
转换成ISO-8859编码后是
PageResourceBrowser.page.title=\u6587\u4ef6\u8d44\u6e90\u6d4f\u89c8\u5668
把其他的配置全改完之后重启geoserver就能看到插件的中文的界面了