private JSONObj resource(JSONObj obj, StoreInfo store, String name, HttpServletRequest req) throws IOException { obj.put("name", name); if (store instanceof DataStoreInfo) { DataStoreInfo data = (DataStoreInfo) store; @SuppressWarnings("rawtypes") DataAccess dataStore = data.getDataStore(new NullProgressListener()); FeatureType schema; org.geotools.data.ResourceInfo info; if (dataStore instanceof DataStore) { schema = ((DataStore) dataStore).getSchema(name); info = ((DataStore) dataStore).getFeatureSource(name).getInfo(); } else { NameImpl qname = new NameImpl(name); schema = dataStore.getSchema(qname); info = dataStore.getFeatureSource(qname).getInfo(); } String title = info.getTitle() == null ? WordUtils.capitalize(name) : info.getTitle(); String description = info.getDescription() == null ? "" : info.getDescription(); obj.put("title", title); obj.put("description", description); JSONArr keywords = obj.putArray("keywords"); keywords.raw().addAll(info.getKeywords()); IO.bounds(obj.putObject("bounds"), info.getBounds()); IO.schema(obj.putObject("schema"), schema, false); } if (store instanceof CoverageStoreInfo) { CoverageStoreInfo data = (CoverageStoreInfo) store; GridCoverageReader r = data.getGridCoverageReader(null, null); obj.put("title", WordUtils.capitalize(name)); obj.put("description", ""); if (r instanceof GridCoverage2DReader) { GridCoverage2DReader reader = (GridCoverage2DReader) r; CoordinateReferenceSystem crs = reader.getCoordinateReferenceSystem(name); IO.schemaGrid(obj.putObject("schema"), crs, false); } else { IO.schemaGrid(obj.putObject("schema"), AbstractGridFormat.getDefaultCRS(), false); } } JSONArr layers = obj.putArray("layers"); Catalog cat = geoServer.getCatalog(); if (store instanceof CoverageStoreInfo) { // coverage store does not respect native name so we search by id for (CoverageInfo info : cat.getCoveragesByCoverageStore((CoverageStoreInfo) store)) { layers(info, layers); } } else { Filter filter = and(equal("namespace.prefix", store.getWorkspace().getName()), equal("nativeName", name)); try (CloseableIterator<ResourceInfo> published = cat.list(ResourceInfo.class, filter); ) { while (published.hasNext()) { ResourceInfo info = published.next(); if (!info.getStore().getId().equals(store.getId())) { continue; // native name is not enough, double check store id } layers(info, layers); } } } return obj; }