code: public Include getDefineFromFile(String includeName, boolean useCaching) throws QueryException {
  		Include include = null;
  		if (useCaching) {
  			include = CACHED_DEFINES.get(includeName);
  		}
  		if (include != null) {
  			return include;
  		}
  		String namespaceString = includeName.substring(0, includeName.indexOf(":"));
  		String singleIncludeName = includeName.substring(includeName.indexOf(":") + 1);
  		URL resource;
  		try {
  			resource = getClass().getClassLoader().loadClass("org.bimserver.database.queries.StartFrame").getResource("json/" + namespaceString + ".json");
  			if (resource == null) {
  				throw new QueryException("Could not find '" + namespaceString + "' namespace in predefined queries");
  			}
  		} catch (ClassNotFoundException e1) {
  			throw new QueryException("Could not find '" + namespaceString + "' namespace in predefined queries");
  		}
  		OBJECT_MAPPER.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
  		try {
  			ObjectNode predefinedQuery = OBJECT_MAPPER.readValue(resource, ObjectNode.class);
  			Query query = parseJson(namespaceString, predefinedQuery);
  			Include define = query.getDefine(singleIncludeName);
  			if (copyExternalDefines) {
  				define = define.copy();
  			}
  			if (define == null) {
  				throw new QueryException("Could not find '" + singleIncludeName + "' in defines in namespace " + query.getName());
  			}
  			if (useCaching) {
  				CACHED_DEFINES.put(includeName, define);
  			}
  			return define;
  		} catch (JsonParseException e) {
  			throw new QueryException(e);
  		} catch (JsonMappingException e) {
  			throw new QueryException(e);
  		} catch (IOException e) {
  			throw new QueryException(e);
  		}
  	}
docs: TODO thread safety and cache invalidation on file updates