package restx.factory; import com.google.common.base.Joiner; import com.google.common.collect.Lists; import restx.*; import restx.admin.AdminModule; import restx.annotations.RestxResource; import restx.security.PermissionFactory; import restx.security.RestxSecurityManager; import javax.inject.Inject; import java.io.IOException; import java.io.PrintWriter; import java.util.List; @Component public class WarehouseRoute extends StdRoute { private final Warehouse warehouse; private final RestxSecurityManager securityManager; private PermissionFactory permissionFactory; @Inject public WarehouseRoute(Factory factory, RestxSecurityManager securityManager, PermissionFactory permissionFactory) { this(factory.getWarehouse(), securityManager, permissionFactory); } public WarehouseRoute(Warehouse warehouse, RestxSecurityManager securityManager, PermissionFactory permissionFactory) { super("WarehouseRoute", new StdRestxRequestMatcher("GET", "/@/warehouse")); this.warehouse = warehouse; this.securityManager = securityManager; this.permissionFactory = permissionFactory; } @Override public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException { securityManager.check(req, match, permissionFactory.hasRole(AdminModule.RESTX_ADMIN_ROLE)); resp.setContentType("application/json"); List<String> nodesCode = Lists.newArrayList(); List<String> linksCode = Lists.newArrayList(); for (Name<?> name : warehouse.listNames()) { nodesCode.add(String.format("{ \"id\": \"%s\", \"name\": \"%s\", \"type\": \"%s\" }", name.asId(), name.getSimpleName(), getType(name))); Iterable<Name<?>> deps = warehouse.listDependencies(name); for (Name<?> dep : deps) { linksCode.add(String.format("{ \"origin\": \"%s\", \"target\": \"%s\" }", name.asId(), dep.asId())); } } PrintWriter writer = resp.getWriter(); writer.println("{"); writer.println("\"nodes\": ["); Joiner.on(",\n").appendTo(writer, nodesCode); writer.println("\n],"); writer.println("\"links\": ["); Joiner.on(",\n").appendTo(writer, linksCode); writer.println("\n]"); writer.println("}"); } private String getType(Name<?> name) { if (RestxRouter.class.isAssignableFrom(name.getClazz())) { return RestxRouter.class.getSimpleName(); } if (RestxRoute.class.isAssignableFrom(name.getClazz())) { return RestxRoute.class.getSimpleName(); } if (name.getClazz().getName().endsWith("Resource")) { return RestxResource.class.getSimpleName(); } return name.getClazz().getSimpleName(); } }