class HttpProtocolServer implements ProtocolServer {

    @Override
    public CompletableFuture<Void> expose(ExposedThing thing) {
        if (!started) {
            return failedFuture(new ProtocolServerException("Unable to expose thing before HttpServer has been started"));
        }

        log.info("HttpServer on '{}' port '{}' exposes '{}' at http://{}:{}/{}", bindHost, actualPort, thing.getId(),
                bindHost, actualPort, thing.getId());

        things.put(thing.getId(), thing);

        for (String address : actualAddresses) {
            for (String contentType : ContentManager.getOfferedMediaTypes()) {
                // make reporting of all properties optional?
                if (true) {
                    String href = address + "/" + thing.getId() + "/all/properties";
                    Form form = new Form.Builder()
                            .setHref(href)
                            .setContentType(contentType)
                            .setOp(Operation.READ_ALL_PROPERTIES, Operation.READ_MULTIPLE_PROPERTIES/*, Operation.writeallproperties, Operation.writemultipleproperties*/)
                            .build();

                    thing.addForm(form);
                    log.debug("Assign '{}' for reading all properties", href);
                }

                exposeProperties(thing, address, contentType);
                exposeActions(thing, address, contentType);
                exposeEvents(thing, address, contentType);
            }
        }

        return completedFuture(null);
    }

    public  HttpProtocolServer(Config config);
    @SuppressWarnings({ "java:S107" })  HttpProtocolServer(String bindHost,
                       int bindPort,
                       List<String> addresses,
                       Service server,
                       Map<String, ExposedThing> things,
                       Map<String, Object> security,
                       String securityScheme,
                       boolean started,
                       int actualPort,
                       List<String> actualAddresses);

}