docs: protected void fetchPropertyInformation(PropertyIdValue property) {
  		int propertyIdNumber = Integer.parseInt(property.getId().substring(1));
  		// Don't do anything if all properties up to this index have already
  		// been fetched. In particular, don't try indefinitely to find a
  		// certain property type (maybe the property was deleted).
  		if (this.smallestUnfetchedPropertyIdNumber > propertyIdNumber) {
  			return;
  		}
  
  		List<String> propertyIds = new ArrayList<String>(
  				API_MAX_ENTITY_DOCUMENT_NUMBER);
  
  		propertyIds.add(property.getId());
  		for (int i = 1; i < API_MAX_ENTITY_DOCUMENT_NUMBER; i++) {
  			propertyIds.add("P" + this.smallestUnfetchedPropertyIdNumber);
  			this.smallestUnfetchedPropertyIdNumber++;
  		}
  
  		dataFetcher.getFilter().setLanguageFilter(Collections.emptySet());
  		dataFetcher.getFilter().setSiteLinkFilter(Collections.emptySet());
  
  		Map<String, EntityDocument> properties;
  		try {
  			properties = dataFetcher.getEntityDocuments(propertyIds);
  		} catch (MediaWikiApiErrorException e) {
  			logger.error("Error when trying to fetch property data: "
  					+ e.toString());
  			properties = Collections.emptyMap();
  		} catch (IOException e) {
  			logger.error("Error when trying to fetch property data: "
  					+ e.toString());
  			properties = Collections.emptyMap();
  		}
  
  		for (Entry<String, EntityDocument> entry : properties.entrySet()) {
  			EntityDocument propertyDocument = entry.getValue();
  			if (!(propertyDocument instanceof PropertyDocument)) {
  				continue;
  			}
  
  			String datatype = ((PropertyDocument) propertyDocument)
  					.getDatatype().getIri();
  			this.datatypes.put(entry.getKey(), datatype);
  			logger.info("Fetched type information for property "
  					+ entry.getKey() + " online: " + datatype);
  
  			if (!DatatypeIdValue.DT_STRING.equals(datatype)) {
  				continue;
  			}
  
  			for (StatementGroup sg : ((PropertyDocument) propertyDocument)
  					.getStatementGroups()) {
  				if (!sg.getProperty().getId().equals(this.uriPatternPropertyId)) {
  					continue;
  				}
  				for (Statement statement : sg) {
  					if (statement.getMainSnak() instanceof ValueSnak
  							&& statement.getValue() instanceof StringValue) {
  						String uriPattern = ((StringValue) statement.getValue()).getString();
  						if (this.uriPatterns.containsKey(entry.getKey())) {
  							logger.info("Found multiple URI patterns for property "
  									+ entry.getKey()
  									+ " but only one is supported in current code.");
  						}
  						this.uriPatterns.put(entry.getKey(), uriPattern);
  					}
  				}
  			}
  		}
  
  		if (!this.datatypes.containsKey(property.getId())) {
  			logger.error("Failed to fetch type information for property "
  					+ property.getId() + " online.");
  		}
  	}