/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.jooby.internal.spec; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.function.Function; import java.util.stream.Collectors; import org.jooby.MediaType; import org.jooby.Route; import org.jooby.spec.RouteParam; import org.jooby.spec.RouteResponse; import org.jooby.spec.RouteSpec; public class RouteSpecImpl extends SerObject implements RouteSpec { /** default serial. */ private static final long serialVersionUID = 1L; public RouteSpecImpl(final Route.Definition route, final String name, final String summary, final String doc, final List<RouteParam> params, final RouteResponse rsp) { put("method", route.method()); put("pattern", route.pattern()); if (!name.equals("/anonymous")) { put("name", name); } put("consumes", route.consumes().stream() .map(MediaType::name) .collect(Collectors.toList())); put("produces", route.produces().stream() .map(MediaType::name) .collect(Collectors.toList())); put("summary", summary); put("doc", doc); put("params", params); put("response", rsp); put("attributes", new HashMap<>(route.attributes())); } protected RouteSpecImpl() { } @Override public Optional<String> name() { return Optional.ofNullable(get("name")); } @Override public Optional<String> summary() { return Optional.ofNullable(get("summary")); } @Override public String method() { return get("method"); } @Override public String pattern() { return get("pattern"); } @Override public Optional<String> doc() { return Optional.ofNullable(get("doc")); } @Override public List<String> consumes() { return get("consumes"); } @Override public List<String> produces() { return get("produces"); } @Override public List<RouteParam> params() { return get("params"); } @Override public RouteResponse response() { return get("response"); } @Override public Map<String, Object> attributes() { return get("attributes"); } @Override public String toString() { int len = 80; Function<String, String> truncate = v -> { String s = v; if (s.length() > len) { s = s.substring(0, len - 3) + "..."; } return s.replace("\n", "\\n"); }; StringBuilder buff = new StringBuilder(); buff.append(method()).append(" ").append(pattern()).append("\n"); name().ifPresent(v -> buff.append(" name: ").append(v).append("\n")); summary().ifPresent(v -> buff.append(" summary: ").append(truncate.apply(v)).append("\n")); doc().ifPresent(v -> buff.append(" doc: ").append(truncate.apply(v)).append("\n")); buff.append(" consumes: ").append(consumes()).append("\n"); buff.append(" produces: ").append(produces()).append("\n"); buff.append(" params: ").append("\n"); params().forEach(p -> { buff.append(" ").append(p.name()).append(": \n"); buff.append(" paramType: ").append(p.paramType()).append("\n"); buff.append(" type: ").append(p.type().getTypeName()).append("\n"); Object pval = p.value(); if (pval != null) { buff.append(" value: ").append(pval).append("\n"); } p.doc().ifPresent(v -> buff.append(" doc: ").append(truncate.apply(v)).append("\n")); }); buff.append(" response: ").append("\n"); buff.append(" type: ").append(response().type().getTypeName()).append("\n"); buff.append(" statusCodes: ").append("\n"); response().statusCodes().forEach( (sc, label) -> buff.append(" ").append(sc).append(": ").append(label).append("\n")); response().doc() .ifPresent(v -> buff.append(" doc: ").append(truncate.apply(v)).append("\n")); buff.setLength(buff.length() - 1); return buff.toString(); } }