package netflix.adminresources.pages; import com.google.inject.Inject; import com.google.inject.Singleton; import com.sun.jersey.api.view.Viewable; import netflix.admin.AdminConfigImpl; import netflix.admin.AdminContainerConfig; import netflix.adminresources.AdminPageInfo; import netflix.adminresources.AdminPageRegistry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.annotation.PostConstruct; import javax.ws.rs.*; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.util.Collection; import java.util.HashMap; import java.util.Map; @Path("/") @Produces(MediaType.TEXT_HTML) @Singleton public class AdminPageResource { private static final Logger LOG = LoggerFactory.getLogger(AdminPageResource.class); @Inject(optional = true) private AdminContainerConfig adminContainerConfig; @Inject(optional = true) private AdminPageRegistry adminPageRegistry; @PostConstruct public void init() { if (adminPageRegistry == null) { adminPageRegistry = new AdminPageRegistry(); } if (adminContainerConfig == null) { adminContainerConfig = new AdminConfigImpl(); } } @GET() public Viewable showIndex() { Map<String, Object> model = new HashMap<String, Object>(); model.put("ajax_base", adminContainerConfig.ajaxDataResourceContext()); model.put("template_base", adminContainerConfig.templateResourceContext()); if (adminPageRegistry != null) { final Collection<AdminPageInfo> adminPages = adminPageRegistry.getAllPages(); model.put("adminPages", adminPages); } return new Viewable("/webadmin/home.ftl", model); } @GET @Path("/{view}") public Viewable showViewIndex( @PathParam("view") String view, @QueryParam("id") @DefaultValue("") String id ) { LOG.info(view); Map<String, Object> model = new HashMap<String, Object>(); model.put("id", id); model.put("ajax_base", adminContainerConfig.ajaxDataResourceContext()); model.put("template_base", adminContainerConfig.templateResourceContext()); if (adminPageRegistry != null && adminPageRegistry.getPageInfo(view) != null) { final Map<String, Object> pageDataModel = adminPageRegistry.getPageInfo(view).getDataModel(); if (pageDataModel != null) { model.putAll(pageDataModel); } return new Viewable(adminPageRegistry.getPageInfo(view).getPageTemplate(), model); } throw new WebApplicationException(Response.Status.NOT_FOUND); } @POST @Path("/{view}") public Viewable createObject( @PathParam("view") String view, @QueryParam("id") @DefaultValue("") String id ) { LOG.info(view); Map<String, Object> model = new HashMap<String, Object>(); model.put("id", id); return new Viewable("/webadmin/" + view + "/create.ftl", model); } @GET @Path("/jmx/mbean") public Viewable showJMXMbean(@QueryParam("id") String id, @QueryParam("key") String key) { LOG.info(""); Map<String, Object> model = new HashMap<String, Object>(); model.put("id", id); model.put("key", key); model.put("ajax_base", adminContainerConfig.ajaxDataResourceContext()); return new Viewable("/webadmin/jmx/view.ftl", model); } }