@RequestMapping(value="/{wsName}/{name}/layers", method = RequestMethod.PUT)
public @ResponseBody JSONArr mapLayerListPut(@PathVariable String wsName,
@PathVariable String name,
@RequestBody JSONArr layers, HttpServletRequest req) {
Catalog cat = geoServer.getCatalog();
LayerGroupInfo m = findMap(wsName, name, cat);
// original
List<MapLayer> mapLayers = MapLayer.list(m);
Map<String,MapLayer> lookup = Maps.uniqueIndex(mapLayers, new Function<MapLayer, String>() {
@Nullable
public String apply(@Nullable MapLayer input) {
return input.layer.getName();
}
});
// modified
List<PublishedInfo> reLayers = new ArrayList<PublishedInfo>();
Map<String,PublishedInfo> check = Maps.uniqueIndex(reLayers, new Function<PublishedInfo, String>() {
@Nullable
public String apply(@Nullable PublishedInfo input) {
return input.getName();
}
});
List<StyleInfo> reStyles = new ArrayList<StyleInfo>();
for (JSONObj l : Lists.reverse(Lists.newArrayList(layers.objects()))) {
String layerName = l.str("name");
String layerWorkspace = l.str("workspace");
MapLayer mapLayer = lookup.get(layerName);
if (mapLayer == null) {
LayerInfo layer = findLayer( layerWorkspace, layerName);
if (layer != null) {
mapLayer = new MapLayer(layer, layer.getDefaultStyle());
}
}
if (mapLayer == null) {
throw new NotFoundException("No such layer: " + l.toString());
}
if(check.containsKey(layerName)){
throw new BadRequestException("Duplicate layer: " + l.toString() );
}
reLayers.add(mapLayer.layer);
reStyles.add(mapLayer.style);
}
m.getLayers().clear();
m.getLayers().addAll(reLayers);
m.getStyles().clear();
m.getStyles().addAll(reStyles);
WorkspaceInfo ws = m.getWorkspace();
Date modified = new Date();
Metadata.modified(m, modified);
Metadata.modified(ws, modified);