// InitHandler sets the app handler's search handler, if the app handler was configured // to have one with HasSearch. func (a *Handler) InitHandler(hl blobserver.FindHandlerByTyper) error { apName := a.ProgramName() searchPrefix, _, err := hl.FindHandlerByType("search") if err != nil { return fmt.Errorf("No search handler configured, which is necessary for the %v app handler", apName) } var sh *search.Handler _, hi := hl.AllHandlers() h, ok := hi[searchPrefix] if !ok { return fmt.Errorf("failed to find the \"search\" handler for %v", apName) } sh = h.(*search.Handler) a.sh = sh return nil }
// InitHandler goes through all the other configured handlers to discover // the publisher ones, and uses them to populate ui.publishRoots. func (ui *UIHandler) InitHandler(hl blobserver.FindHandlerByTyper) error { // InitHandler is called after all handlers have been setup, so the bootstrap // of the camliRoot node for publishers in dev-mode is already done. searchPrefix, _, err := hl.FindHandlerByType("search") if err != nil { return errors.New("No search handler configured, which is necessary for the ui handler") } var sh *search.Handler htype, hi := hl.AllHandlers() if h, ok := hi[searchPrefix]; !ok { return errors.New("failed to find the \"search\" handler") } else { sh = h.(*search.Handler) ui.search = sh } camliRootQuery := func(camliRoot string) (*search.SearchResult, error) { return sh.Query(&search.SearchQuery{ Limit: 1, Constraint: &search.Constraint{ Permanode: &search.PermanodeConstraint{ Attr: "camliRoot", Value: camliRoot, }, }, }) } for prefix, typ := range htype { if typ != "app" { continue } ah, ok := hi[prefix].(*app.Handler) if !ok { panic(fmt.Sprintf("UI: handler for %v has type \"app\" but is not app.Handler", prefix)) } if ah.ProgramName() != "publisher" { continue } appConfig := ah.AppConfig() if appConfig == nil { log.Printf("UI: app handler for %v has no appConfig", prefix) continue } camliRoot, ok := appConfig["camliRoot"].(string) if !ok { log.Printf("UI: camliRoot in appConfig is %T, want string", appConfig["camliRoot"]) continue } result, err := camliRootQuery(camliRoot) if err != nil { log.Printf("UI: could not find permanode for camliRoot %v: %v", camliRoot, err) continue } if len(result.Blobs) == 0 || !result.Blobs[0].Blob.Valid() { log.Printf("UI: no valid permanode for camliRoot %v", camliRoot) continue } if ui.publishRoots == nil { ui.publishRoots = make(map[string]*publishRoot) } ui.publishRoots[prefix] = &publishRoot{ Name: camliRoot, Prefix: prefix, Permanode: result.Blobs[0].Blob, } } return nil }