package restx; import com.google.common.base.Optional; import restx.description.DescribableRoute; import restx.description.OperationDescription; import restx.description.ResourceDescription; import restx.http.HttpStatus; import java.io.IOException; import java.util.Collection; import java.util.Collections; import static com.google.common.base.Preconditions.checkNotNull; /** * User: xavierhanin * Date: 1/19/13 * Time: 8:10 AM */ public abstract class StdRoute implements RestxRoute, DescribableRoute, RestxHandler { private final String name; private final RestxRequestMatcher matcher; private final HttpStatus successStatus; public StdRoute(String name, RestxRequestMatcher matcher) { this(name, matcher, HttpStatus.OK); } public StdRoute(String name, RestxRequestMatcher matcher, HttpStatus successStatus) { this.name = checkNotNull(name); this.matcher = checkNotNull(matcher); this.successStatus = checkNotNull(successStatus); } @Override public Optional<RestxHandlerMatch> match(RestxRequest req) { String path = req.getRestxPath(); return RestxHandlerMatch.of(matcher.match(req.getHttpMethod(), path), this); } @Override public Collection<ResourceDescription> describe() { if (matcher instanceof StdRestxRequestMatcher) { ResourceDescription description = new ResourceDescription(); StdRestxRequestMatcher stdRouteMatcher = (StdRestxRequestMatcher) matcher; description.path = stdRouteMatcher.getPathPattern(); description.stdPath = stdRouteMatcher.getStdPathPattern(); OperationDescription operation = new OperationDescription(); operation.httpMethod = stdRouteMatcher.getMethod(); operation.nickname = name.substring(name.lastIndexOf('#') + 1); operation.successStatus = getSuccessStatus().createDescriptor(); describeOperation(operation); description.operations = Collections.singletonList(operation); return Collections.singleton(description); } else { return Collections.emptySet(); } } public HttpStatus getSuccessStatus() { return successStatus; } // override to provide parameters, response and error codes description protected void describeOperation(OperationDescription operation) { } public RestxRequestMatcher getMatcher() { return matcher; } @Override public String toString() { return matcher.toString() + " => " + name; } protected void notFound(RestxRequestMatch match, RestxResponse resp) throws IOException { resp.setStatus(HttpStatus.NOT_FOUND); resp.setContentType("text/plain"); resp.getWriter().println("Route matched, but resource " + match.getPath() + " not found."); resp.getWriter().println("Matched route: " + this); } }