private ResourceSearchResults GetSearchResults(BrowseResult result, int skip, int take) { // TotalMatches var searchResults = new ResourceSearchResults { TotalMatches = result.getNumHits() }; // ResourceItemIds var hits = result.getHits(); searchResults.ResourceIds = hits .Skip(skip) .Take(take) .Select(hit => new Guid(_browser.doc(hit.getDocid()).get(SearchFieldName.Id))) .ToArray(); // Facets var facetMap = result.getFacetMap(); if (facetMap != null && !facetMap.isEmpty()) { var facets = GetFieldHits(facetMap, FieldName.ItemType, v => v.DecodeToResourceType()); searchResults.ResourceTypeHits = Enum.GetValues(typeof(ResourceType)) .Cast <ResourceType>() .Select(v => new KeyValuePair <ResourceType, int>(v, facets.ContainsKey(v) ? facets[v] : 0)) .ToList(); } return(searchResults); }
private JobAdSearchResults GetSearchResults(BrowseResult result, int skip, int take) { // TotalMatches var searchResults = new JobAdSearchResults { TotalMatches = result.getNumHits() }; // JobAdIds var hits = result.getHits(); searchResults.JobAdIds = hits .Skip(skip) .Take(take) .Select(hit => new Guid(_browser.doc(hit.getDocid()).get(SearchFieldName.Id))) .ToArray(); // Facets var facetMap = result.getFacetMap(); if (facetMap != null) { searchResults.IndustryHits = GetFieldHits(facetMap, FieldName.Industries, v => new Guid(v)); searchResults.JobTypeHits = GetFieldHits(facetMap, FieldName.JobTypes, v => JobTypesFieldHandler.Decode(v)); } return(searchResults); }
protected virtual BrowseResult BrowseFolder(BrowseOptions options) { var result = default(BrowseResult); Windows.Invoke(() => { //TODO: Use only WPF frameworks. using (var dialog = new global::System.Windows.Forms.FolderBrowserDialog()) { dialog.Description = options.Title; if (Directory.Exists(options.Path)) { dialog.SelectedPath = options.Path; } var window = Windows.ActiveWindow; var success = default(bool); switch (dialog.ShowDialog(new Win32Window(window.GetHandle()))) { case global::System.Windows.Forms.DialogResult.OK: success = true; break; } result = new BrowseResult(new[] { dialog.SelectedPath }, success); } //TODO: Bad .Wait(). }).Wait(); return(result); }
public static string FormatResults(BrowseResult res) { var sb = new StringBuilder(); sb.Append(res.NumHits); sb.Append(" hits out of "); sb.Append(res.TotalDocs); sb.Append(" docs\n"); BrowseHit[] hits = res.Hits; var map = res.FacetMap; var keys = map.Keys; foreach (string key in keys) { var fa = map[key]; sb.AppendLine(key); var lf = fa.GetFacets(); foreach (var bf in lf) { sb.AppendLine("\t" + bf); } } foreach (BrowseHit hit in hits) { sb.AppendLine("------------"); sb.Append(FormatHit(hit)); sb.AppendLine(); } sb.Append("*****************************\n"); return(sb.ToString()); }
public JsonResult Browse(string path) { //TODO:Add security checks var files = new FilesRepository(); BrowseResult result; if (string.IsNullOrEmpty(path) || path == "/") { var root = files.GetRootFolder(); var rootPath = VirtualPathUtility.AppendTrailingSlash(root != null ? root.Name : string.Empty); result = new BrowseResult { Files = files.Images(root), Directories = files.Folders(root), Path = rootPath, ContentPaths = new[] { rootPath } }; } else { result = new BrowseResult { Files = files.Images(path), Directories = files.Folders(path), Path = VirtualPathUtility.AppendTrailingSlash(path), ContentPaths = new[] { VirtualPathUtility.AppendTrailingSlash(path) } }; } return(Json(result)); }
protected virtual BrowseResult BrowseFile(BrowseOptions options) { var result = default(BrowseResult); Windows.Invoke(() => { var dialog = new OpenFileDialog() { Title = options.Title, Filter = GetFilter(options.Filters), Multiselect = options.Flags.HasFlag(BrowseFlags.Multiselect), }; if (File.Exists(options.Path)) { dialog.InitialDirectory = Path.GetDirectoryName(options.Path); dialog.FileName = options.Path; } else if (Directory.Exists(options.Path)) { dialog.InitialDirectory = options.Path; } var window = Windows.ActiveWindow; var success = dialog.ShowDialog(window); result = new BrowseResult(dialog.FileNames, success.GetValueOrDefault()); //TODO: Bad .Wait(). }).Wait(); return(result); }
public void Test6NonExisitngPropertyDocRetrieval() { BrowseRequest request = CreateRequest(1, "propMissing"); BrowseResult res = browser.Browse(request); Assert.AreEqual(res.NumHits, 0); }
public static string FormatResults(BrowseResult res) { var sb = new StringBuilder(); sb.Append(res.NumHits); sb.Append(" hits out of "); sb.Append(res.TotalDocs); sb.Append(" docs\n"); BrowseHit[] hits = res.Hits; var map = res.FacetMap; var keys = map.Keys; foreach (string key in keys) { var fa = map[key]; sb.AppendLine(key); var lf = fa.GetFacets(); foreach (var bf in lf) { sb.AppendLine("\t" + bf); } } foreach (BrowseHit hit in hits) { sb.AppendLine("------------"); sb.Append(FormatHit(hit)); sb.AppendLine(); } sb.Append("*****************************\n"); return sb.ToString(); }
public void Test1Filter() { BrowseRequest request = CreateRequest(1, "prop3"); FacetCountCollectorSource facetCountCollectorSource = attributesFacetHandler.GetFacetCountCollectorSource(request.GetSelection(AttributeHandlerName), request.GetFacetSpec(AttributeHandlerName)); RandomAccessFilter randomAccessFilter = attributesFacetHandler.BuildFilter(request.GetSelection(AttributeHandlerName)); DocIdSetIterator iterator = randomAccessFilter.GetDocIdSet(boboReader).Iterator(); int docId = iterator.NextDoc(); int[] docIds = new int[2]; int i = 0; while (docId != DocIdSetIterator.NO_MORE_DOCS) { docIds[i] = docId; i++; docId = iterator.NextDoc(); } Assert.AreEqual(Arrays.ToString(new int[] { 1, 2 }), Arrays.ToString(docIds)); BrowseResult res = browser.Browse(request); Assert.AreEqual(res.NumHits, 2); IFacetAccessible fa = res.GetFacetAccessor(AttributeHandlerName); IEnumerable <BrowseFacet> facets = fa.GetFacets(); Console.WriteLine(facets); Assert.AreEqual(3, facets.Count()); BrowseFacet facet = facets.Get(0); Assert.AreEqual(1, facet.FacetValueHitCount); }
/// <summary> /// Converts the BoboBrowse FacetMap object into a list of FacetViews /// </summary> /// <param name="browseResults">BoboBrowse results</param> /// <param name="clientFacetConstraints">facet constraints selected on client side</param> /// <returns>A list of facet views</returns> private IEnumerable <FacetView> FacetMapToFacetViews(BrowseResult browseResults, IEnumerable <FacetConstraints> clientFacetConstraints) { var facetViews = new List <FacetView>(); foreach (var facet in browseResults.FacetMap) { var facetConstraints = this.FacetToConstraintHits(facet, clientFacetConstraints, browseResults); if (facetConstraints.Any()) { var allConstraintHits = new List <ConstraintHit>(); if (facet.Key == FixedFacetsConfiguration.RecordTypeFacetFieldName) { allConstraintHits.Add( new ConstraintHit( string.Empty, facet.Value.GetFacets().Where(h => h.Value != "annotation").Sum(hit => hit.FacetValueHitCount), ResourceManager.GetString("Facet_All"))); } allConstraintHits.AddRange(facetConstraints); facetViews.Add(new FacetView(facet.Key, allConstraintHits)); } } return(facetViews); }
public VMConverter(BrowseResult browseResult) { treeNodes = new ObservableCollection <TreeNode>(); foreach (NamespaceNode namespaceNode in browseResult.Namespaces) { treeNodes.Add(new TreeNode(namespaceNode.Name)); treeNodes.Last().Nodes = TypesConverter(namespaceNode.TypeNodes); } }
/// <summary> /// Short-cut to convert a given <seealso cref="BrowseRequest"/> into a final /// result receipt to support simple closure of requests being full-filled or not etc ... /// </summary> /// <param name="request"></param> /// <param name="result"></param> /// <returns></returns> public static FinalBrowseResult FromRequest(BrowseRequest request, BrowseResult result) { if (request != null) { return(new FinalBrowseResult(request.NewLocation, request.RequestId, result)); } return(new FinalBrowseResult(null, default(System.Guid), result)); }
/// <summary> /// Event type class constructor from parameter /// </summary> public BrowsingEventArgs(IPathModel location, bool isBrowsing, BrowseResult result = BrowseResult.Unknown) : this() { Location = location; IsBrowsing = isBrowsing; Result = result; }
public AlbumBrowse EndBrowse(IAsyncResult result) { BrowseResult browseResult = Internal.ThrowHelper.DownCast <BrowseResult>(result, "result"); browseResult.WaitForCallbackComplete(); browseResult.SetCompleted(browseResult.Closure.Error); browseResult.CheckPendingException(); return(browseResult.Closure); }
/// <summary> /// Event type class constructor from parameter /// </summary> public BrowsingEventArgs(IDirectoryBrowser location, bool isBrowsing, BrowseResult result = BrowseResult.Unknown) : this() { Location = location; IsBrowsing = isBrowsing; Result = result; }
/// <summary> /// ShortCut to convert a given <seealso cref="BrowseRequest"/> into a final /// result receipt to support simple closure of requests being full-filled or not etc ... /// </summary> /// <param name="request"></param> /// <param name="result"></param> /// <returns></returns> public static FinalBrowseResult <T> FromRequest(BrowseRequest <T> request, BrowseResult result) { if (request != null) { return(new FinalBrowseResult <T>(request.NewLocation, request.ActionRequested, request.RequestId, result)); } return(new FinalBrowseResult <T>(default(T), RequestType.Navigational, Guid.NewGuid(), result)); }
/// <summary> /// Parameterized class constructor. /// </summary> public FinalBrowseResult(IPathModel requestedLocation, Guid requestId = default(System.Guid), BrowseResult result = BrowseResult.Unknown ) : this() { RequestedLocation = requestedLocation; Result = result; RequestId = requestId; }
public IAsyncResult BeginBrowse(Session session, AsyncCallback userCallback, object state) { Internal.ThrowHelper.ThrowIfNull(session, "session"); Internal.ThrowHelper.ThrowIfNull(userCallback, "userCallback"); BrowseResult browseResult = new BrowseResult(userCallback, state); LibSpotify.sp_albumbrowse_create_r(session.Handle, Handle, browseResult.Complete, IntPtr.Zero); return(browseResult); }
public void TestLogging() { // Set up a simple Log4Net configuration that logs in memory. var memAppend = new log4net.Appender.MemoryAppender(); #if NETCOREAPP1_0 var repository = LogManager.GetRepository(Assembly.GetEntryAssembly()); BasicConfigurator.Configure(repository, memAppend); #else BasicConfigurator.Configure(memAppend); #endif BrowseRequest br = new BrowseRequest(); br.Count = 20; br.Offset = 0; BrowseSelection colorSel = new BrowseSelection("mycolor"); colorSel.AddValue("yellow"); br.AddSelection(colorSel); BrowseSelection makeSel = new BrowseSelection("make"); makeSel.AddValue("rav4"); br.AddSelection(makeSel); FacetSpec spec = new FacetSpec(); spec.ExpandSelection = true; spec.OrderBy = FacetSpec.FacetSortSpec.OrderHitsDesc; spec.MaxCount = 15; br.SetFacetSpec("mycolor", spec); br.SetFacetSpec("id", spec); br.SetFacetSpec("make", spec); Directory ramIndexDir = CreateIndex(); using (DirectoryReader srcReader = DirectoryReader.Open(ramIndexDir)) { using (BoboMultiReader boboReader = BoboMultiReader.GetInstance(srcReader, _facetHandlers)) { using (BoboBrowser boboBrowser = new BoboBrowser(boboReader)) { using (BrowseResult result = boboBrowser.Browse(br)) { } } } } var events = memAppend.GetEvents(); Assert.AreEqual(3, events.Length); StringAssert.StartsWith("facetHandler loaded: id, took:", events[0].RenderedMessage); StringAssert.StartsWith("facetHandler loaded: make, took:", events[1].RenderedMessage); StringAssert.StartsWith("facetHandler loaded: mycolor, took:", events[2].RenderedMessage); }
/// <summary> /// Parameterized class constructor. /// </summary> public FinalBrowseResult(T requestedLocation, RequestType typeOfRequest, Guid requestId = default(System.Guid), BrowseResult result = BrowseResult.Unknown ) : this() { RequestedLocation = requestedLocation; RequestedAction = typeOfRequest; Result = result; RequestId = requestId; }
public void Test4PropertyInFirstDocRetrieval() { BrowseRequest request = CreateRequest(1, "prop5"); BrowseResult res = browser.Browse(request); Assert.AreEqual(res.NumHits, 1); Assert.AreEqual(res.Hits[0].DocId, 0); IEnumerable <BrowseFacet> facets = res.GetFacetAccessor(AttributeHandlerName).GetFacets(); Assert.AreEqual(facets.Count(), 1); Assert.AreEqual(facets.Get(0).Value, "prop5=val1"); Assert.AreEqual(facets.Get(0).FacetValueHitCount, 1); }
public void TestNotValuesForSimpleFacetHandler() { BrowseRequest br = new BrowseRequest(); br.Count = 20; br.Offset = 0; BrowseSelection colorSel = new BrowseSelection("color"); colorSel.AddValue("red"); br.AddSelection(colorSel); BrowseSelection idSel = new BrowseSelection("id"); idSel.AddNotValue("0"); br.AddSelection(idSel); BrowseResult result = null; BoboBrowser boboBrowser = null; int expectedHitNum = (_documentSize / 2) - 1; using (Directory ramIndexDir = CreateIndex()) { using (IndexReader srcReader = IndexReader.Open(ramIndexDir, true)) { using (boboBrowser = new BoboBrowser(BoboIndexReader.GetInstance(srcReader, _facetHandlers, null))) { result = boboBrowser.Browse(br); Assert.AreEqual(expectedHitNum, result.NumHits); StringBuilder buffer = new StringBuilder(); BrowseHit[] hits = result.Hits; for (int i = 0; i < hits.Length; ++i) { int expectedID = (i + 1) * 2; Assert.AreEqual(expectedID, int.Parse(hits[i].GetField("id"))); if (i != 0) { buffer.Append('\n'); } buffer.Append("id=" + hits[i].GetField("id") + "," + "color=" + hits[i].GetField("color")); } log.Info(buffer.ToString()); } } } }
public void Test3PropertyInEachDocRetrieval() { BrowseRequest request = CreateRequest(1, "prop1"); BrowseResult res = browser.Browse(request); Assert.AreEqual(res.NumHits, 6); Assert.AreEqual(res.Hits[0].DocId, 0); Assert.AreEqual(res.Hits[5].DocId, 5); ICollection <BrowseFacet> facets = res.GetFacetAccessor(AttributeHandlerName).GetFacets(); Assert.AreEqual(facets.Count, 2); Assert.AreEqual(facets.Get(0).Value, "prop1=val1"); Assert.AreEqual(facets.Get(0).FacetValueHitCount, 4); Assert.AreEqual(facets.Get(1).Value, "prop1=val2"); Assert.AreEqual(facets.Get(1).FacetValueHitCount, 2); }
public void Test2PropertyRetrieval() { BrowseRequest request = CreateRequest(1, "prop3"); BrowseResult res = browser.Browse(request); Assert.AreEqual(res.NumHits, 2); Assert.AreEqual(res.Hits[0].DocId, 1); Assert.AreEqual(res.Hits[1].DocId, 2); ICollection <BrowseFacet> facets = res.GetFacetAccessor(AttributeHandlerName).GetFacets(); Assert.AreEqual(facets.Count, 3); Assert.AreEqual(facets.Get(0).Value, "prop3=val1"); Assert.AreEqual(facets.Get(0).FacetValueHitCount, 1); Assert.AreEqual(facets.Get(2).Value, "prop3=val3"); Assert.AreEqual(facets.Get(2).FacetValueHitCount, 1); }
/// <summary> /// Converts the BoboBrowse BrowseResult object into the generic RawSearchResultSet for processing. /// </summary> /// <param name="browseResults">The BoboBrowse BrowseResult for the search</param> /// <param name="offset">The numbers of results to skip since they've already been processed</param> /// <param name="facetConstraints">The constraint hit map given by BoboBrowse.</param> /// <returns>The converted raw search result set.</returns> private RawSearchResultSet ConvertBoboBrowseResultsToRawSearchResultSet(BrowseResult browseResults, int offset, IEnumerable <FacetConstraints> facetConstraints) { List <RawSearchResult> rawSearchResults = new List <RawSearchResult>(); for (int i = offset; i < browseResults.Hits.Length; i++) { rawSearchResults.Add(new RawSearchResult(browseResults.Hits[i].DocId, browseResults.Hits[i].Score)); } // transform the BoboBrowse-specific facet map to our more general data structure var facetViews = this.FacetMapToFacetViews(browseResults, facetConstraints ?? Enumerable.Empty <FacetConstraints>()); var sortingOptions = this.GetSortingOptions(facetViews, facetConstraints); return(new RawSearchResultSet(rawSearchResults, browseResults.NumHits, facetViews, sortingOptions)); }
public void Test5PropertyInLastDocRetrieval() { BrowseRequest request = CreateRequest(1, "prop4"); BrowseResult res = browser.Browse(request); Console.WriteLine(res); Assert.AreEqual(res.NumHits, 1); Assert.AreEqual(res.Hits[0].DocId, 5); IEnumerable <BrowseFacet> facets = res.GetFacetAccessor(AttributeHandlerName).GetFacets(); Assert.AreEqual(facets.Count(), 2); Assert.AreEqual(facets.Get(0).Value, "prop4=val2"); Assert.AreEqual(facets.Get(0).FacetValueHitCount, 1); Assert.AreEqual(facets.Get(1).Value, "prop4=val3"); Assert.AreEqual(facets.Get(1).FacetValueHitCount, 1); }
/// <summary> /// Follows hierarchial references from the current node and updates the tree. /// </summary> private void Browse(TreeNode parent) { parent.Nodes.Clear(); ReferenceDescription start = parent.Tag as ReferenceDescription; ListOfBrowseDescription nodesToBrowse = new ListOfBrowseDescription(); BrowseDescription nodeToBrowse = new BrowseDescription(); nodeToBrowse.NodeId = new NodeId(start.NodeId); nodeToBrowse.BrowseDirection = BrowseDirection.Forward_0; nodeToBrowse.ReferenceTypeId = new NodeId(ReferenceTypes.HierarchicalReferences); nodeToBrowse.IncludeSubtypes = true; nodeToBrowse.ResultMask = (uint)DataTypes.EnumToMask(BrowseResultMask.All_63); nodeToBrowse.NodeClassMask = 0; nodesToBrowse.Add(nodeToBrowse); ListOfBrowseResult results; ListOfDiagnosticInfo diagnosticInfos; m_client.Browse( m_client.CreateRequestHeader(), null, 0, nodesToBrowse, out results, out diagnosticInfos); if (results != null && results.Count > 0) { BrowseResult result = results[0]; if (result.References != null) { foreach (ReferenceDescription reference in result.References) { TreeNode child = new TreeNode(reference.DisplayName.Text); child.Tag = reference; child.Nodes.Add(new TreeNode()); parent.Nodes.Add(child); } } } }
public void Test7AndProperties() { BrowseRequest request = CreateRequest(1, BrowseSelection.ValueOperation.ValueOperationAnd, "prop1", "prop3"); BrowseResult res = browser.Browse(request); Console.WriteLine(res); Assert.AreEqual(res.NumHits, 2); Assert.AreEqual(res.Hits[0].DocId, 1); Assert.AreEqual(res.Hits[1].DocId, 2); IEnumerable <BrowseFacet> facets = res.GetFacetAccessor(AttributeHandlerName).GetFacets(); Assert.AreEqual(facets.Count(), 4); Assert.AreEqual(facets.Get(0).Value, "prop1=val2"); Assert.AreEqual(facets.Get(0).FacetValueHitCount, 2); Assert.AreEqual(facets.Get(1).Value, "prop3=val1"); Assert.AreEqual(facets.Get(1).FacetValueHitCount, 1); }
public void TestFacetNameForSimpleFacetHandler() { BrowseRequest br = new BrowseRequest(); br.Count = 20; br.Offset = 0; BrowseSelection colorSel = new BrowseSelection("mycolor"); colorSel.AddValue("yellow"); br.AddSelection(colorSel); BrowseSelection makeSel = new BrowseSelection("make"); makeSel.AddValue("rav4"); br.AddSelection(makeSel); FacetSpec spec = new FacetSpec(); spec.ExpandSelection = true; spec.OrderBy = FacetSpec.FacetSortSpec.OrderHitsDesc; spec.MaxCount = 15; br.SetFacetSpec("mycolor", spec); br.SetFacetSpec("id", spec); br.SetFacetSpec("make", spec); int expectedHitNum = 3; Directory ramIndexDir = CreateIndex(); using (DirectoryReader srcReader = DirectoryReader.Open(ramIndexDir)) { using (BoboMultiReader boboReader = BoboMultiReader.GetInstance(srcReader, _facetHandlers)) { using (BoboBrowser boboBrowser = new BoboBrowser(boboReader)) { using (BrowseResult result = boboBrowser.Browse(br)) { Assert.AreEqual(expectedHitNum, result.NumHits); } } } } }
public void Test9ModifiedNumberOfFacetsPerKey() { ModifiedSetup(); BrowseRequest request = CreateRequest(1, BrowseSelection.ValueOperation.ValueOperationOr); request.GetFacetSpec(AttributeHandlerName).OrderBy = FacetSpec.FacetSortSpec.OrderHitsDesc; BrowseResult res = browser.Browse(request); Console.WriteLine(res); IEnumerable <BrowseFacet> facets = res.GetFacetAccessor(AttributeHandlerName).GetFacets(); Assert.AreEqual(facets.Count(), 6); Assert.AreEqual(facets.Get(0).Value, "prop1=val1"); Assert.AreEqual(facets.Get(0).FacetValueHitCount, 4); Assert.AreEqual(facets.Get(1).Value, "prop2=val1"); Assert.AreEqual(facets.Get(1).FacetValueHitCount, 4); Assert.AreEqual(facets.Get(2).Value, "prop3=val1"); Assert.AreEqual(facets.Get(2).FacetValueHitCount, 1); }
/// <summary> /// Returns the references that meet the filter criteria for one or more nodes. /// </summary> public BrowseResponseMessage Browse(BrowseMessage request) { try { lock (m_lock) { // verify the session. VerifySession(request.RequestHeader, false); // process each node being browsed. ListOfBrowseResult results = new ListOfBrowseResult(); ListOfDiagnosticInfo diagnosticInfos = new ListOfDiagnosticInfo(); for (int ii = 0; ii < request.NodesToBrowse.Count; ii++) { BrowseResult result = new BrowseResult(); DiagnosticInfo diagnosticInfo = new DiagnosticInfo(); m_nodeManager.Browse( request.NodesToBrowse[ii], result, diagnosticInfo); results.Add(result); diagnosticInfos.Add(diagnosticInfo); } // return the response. BrowseResponseMessage response = new BrowseResponseMessage(); response.ResponseHeader = CreateResponseHeader(request.RequestHeader); response.Results = results; response.DiagnosticInfos = diagnosticInfos; return(response); } } catch (Exception e) { throw CreateSoapFault(request.RequestHeader, e); } }
/// <summary> /// Returns the set of references that meet the filter criteria. /// </summary> public virtual void Browse( OperationContext context, ViewDescription view, uint maxReferencesPerNode, BrowseDescriptionCollection nodesToBrowse, out BrowseResultCollection results, out DiagnosticInfoCollection diagnosticInfos) { if (context == null) throw new ArgumentNullException("context"); if (nodesToBrowse == null) throw new ArgumentNullException("nodesToBrowse"); if (view != null && !NodeId.IsNull(view.ViewId)) { INodeManager viewManager = null; object viewHandle = GetManagerHandle(view.ViewId, out viewManager); if (viewHandle == null) { throw new ServiceResultException(StatusCodes.BadViewIdUnknown); } NodeMetadata metadata = viewManager.GetNodeMetadata(context, viewHandle, BrowseResultMask.NodeClass); if (metadata == null || metadata.NodeClass != NodeClass.View) { throw new ServiceResultException(StatusCodes.BadViewIdUnknown); } view.Handle = viewHandle; } bool diagnosticsExist = false; results = new BrowseResultCollection(nodesToBrowse.Count); diagnosticInfos = new DiagnosticInfoCollection(nodesToBrowse.Count); uint continuationPointsAssigned = 0; for (int ii = 0; ii < nodesToBrowse.Count; ii++) { // check if request has timed out or been cancelled. if (StatusCode.IsBad(context.OperationStatus)) { // release all allocated continuation points. foreach (BrowseResult current in results) { if (current != null && current.ContinuationPoint != null && current.ContinuationPoint.Length > 0) { ContinuationPoint cp = context.Session.RestoreContinuationPoint(current.ContinuationPoint); cp.Dispose(); } } throw new ServiceResultException(context.OperationStatus); } BrowseDescription nodeToBrowse = nodesToBrowse[ii]; // initialize result. BrowseResult result = new BrowseResult(); result.StatusCode = StatusCodes.Good; results.Add(result); ServiceResult error = null; // need to trap unexpected exceptions to handle bugs in the node managers. try { error = Browse( context, view, maxReferencesPerNode, continuationPointsAssigned < m_maxContinuationPointsPerBrowse, nodeToBrowse, result); } catch (Exception e) { error = ServiceResult.Create(e, StatusCodes.BadUnexpectedError, "Unexpected error browsing node."); } // check for continuation point. if (result.ContinuationPoint != null && result.ContinuationPoint.Length > 0) { continuationPointsAssigned++; } // check for error. result.StatusCode = error.StatusCode; if ((context.DiagnosticsMask & DiagnosticsMasks.OperationAll) != 0) { DiagnosticInfo diagnosticInfo = null; if (error != null && error.Code != StatusCodes.Good) { diagnosticInfo = ServerUtils.CreateDiagnosticInfo(m_server, context, error); diagnosticsExist = true; } diagnosticInfos.Add(diagnosticInfo); } } // clear the diagnostics array if no diagnostics requested or no errors occurred. UpdateDiagnostics(context, diagnosticsExist, ref diagnosticInfos); }
/// <summary> /// Returns the set of references that meet the filter criteria. /// </summary> private ServiceResult Browse( OperationContext context, ViewDescription view, uint maxReferencesPerNode, bool assignContinuationPoint, BrowseDescription nodeToBrowse, BrowseResult result) { Debug.Assert(context != null); Debug.Assert(nodeToBrowse != null); Debug.Assert(result != null); // find node manager that owns the node. INodeManager nodeManager = null; object handle = GetManagerHandle(nodeToBrowse.NodeId, out nodeManager); if (handle == null) { return StatusCodes.BadNodeIdUnknown; } if (!NodeId.IsNull(nodeToBrowse.ReferenceTypeId) && !m_server.TypeTree.IsKnown(nodeToBrowse.ReferenceTypeId)) { return StatusCodes.BadReferenceTypeIdInvalid; } if (nodeToBrowse.BrowseDirection < BrowseDirection.Forward || nodeToBrowse.BrowseDirection > BrowseDirection.Both) { return StatusCodes.BadBrowseDirectionInvalid; } // create a continuation point. ContinuationPoint cp = new ContinuationPoint(); cp.Manager = nodeManager; cp.View = view; cp.NodeToBrowse = handle; cp.MaxResultsToReturn = maxReferencesPerNode; cp.BrowseDirection = nodeToBrowse.BrowseDirection; cp.ReferenceTypeId = nodeToBrowse.ReferenceTypeId; cp.IncludeSubtypes = nodeToBrowse.IncludeSubtypes; cp.NodeClassMask = nodeToBrowse.NodeClassMask; cp.ResultMask = (BrowseResultMask)nodeToBrowse.ResultMask; cp.Index = 0; cp.Data = null; // check if reference type left unspecified. if (NodeId.IsNull(cp.ReferenceTypeId)) { cp.ReferenceTypeId = ReferenceTypeIds.References; cp.IncludeSubtypes = true; } // loop until browse is complete or max results. ReferenceDescriptionCollection references = result.References; ServiceResult error = FetchReferences(context, assignContinuationPoint, ref cp, ref references); result.References = references; // save continuation point. if (cp != null) { result.StatusCode = StatusCodes.Good; result.ContinuationPoint = cp.Id.ToByteArray(); } // all is good. return error; }
/// <summary> /// Continues a browse operation that was previously halted. /// </summary> public virtual void BrowseNext( OperationContext context, bool releaseContinuationPoints, ByteStringCollection continuationPoints, out BrowseResultCollection results, out DiagnosticInfoCollection diagnosticInfos) { if (context == null) throw new ArgumentNullException("context"); if (continuationPoints == null) throw new ArgumentNullException("continuationPoints"); bool diagnosticsExist = false; results = new BrowseResultCollection(continuationPoints.Count); diagnosticInfos = new DiagnosticInfoCollection(continuationPoints.Count); uint continuationPointsAssigned = 0; for (int ii = 0; ii < continuationPoints.Count; ii++) { ContinuationPoint cp = null; // check if request has timed out or been cancelled. if (StatusCode.IsBad(context.OperationStatus)) { // release all allocated continuation points. foreach (BrowseResult current in results) { if (current != null && current.ContinuationPoint != null && current.ContinuationPoint.Length > 0) { cp = context.Session.RestoreContinuationPoint(current.ContinuationPoint); cp.Dispose(); } } throw new ServiceResultException(context.OperationStatus); } // find the continuation point. cp = context.Session.RestoreContinuationPoint(continuationPoints[ii]); // initialize result. BrowseResult result = new BrowseResult(); result.StatusCode = StatusCodes.Good; results.Add(result); // check if simply releasing the continuation point. if (releaseContinuationPoints) { if (cp != null) { cp.Dispose(); cp = null; } continue; } ServiceResult error = null; // check if continuation point has expired. if (cp == null) { error = StatusCodes.BadContinuationPointInvalid; } if (cp != null) { // need to trap unexpected exceptions to handle bugs in the node managers. try { ReferenceDescriptionCollection references = result.References; error = FetchReferences( context, continuationPointsAssigned < m_maxContinuationPointsPerBrowse, ref cp, ref references); result.References = references; } catch (Exception e) { error = ServiceResult.Create(e, StatusCodes.BadUnexpectedError, "Unexpected error browsing node."); } // check for continuation point. if (result.ContinuationPoint != null && result.ContinuationPoint.Length > 0) { continuationPointsAssigned++; } } // check for error. result.StatusCode = error.StatusCode; if ((context.DiagnosticsMask & DiagnosticsMasks.OperationAll) != 0) { DiagnosticInfo diagnosticInfo = null; if (error != null && error.Code != StatusCodes.Good) { diagnosticInfo = ServerUtils.CreateDiagnosticInfo(m_server, context, error); diagnosticsExist = true; } diagnosticInfos.Add(diagnosticInfo); } // check for continuation point. if (cp != null) { result.StatusCode = StatusCodes.Good; result.ContinuationPoint = cp.Id.ToByteArray(); continue; } } // clear the diagnostics array if no diagnostics requested or no errors occurred. UpdateDiagnostics(context, diagnosticsExist, ref diagnosticInfos); }
/// <summary> /// Browses the references for the specified node. /// </summary> public void Browse( BrowseDescription request, BrowseResult result, DiagnosticInfo diagnosticInfo) { lock (m_lock) { // find the starting nodes. Node source = m_nodes.Find(request.NodeId); if (source == null) { result.StatusCode = new StatusCode(StatusCodes.BadNodeIdUnknown); return; } result.References = new ListOfReferenceDescription(); // return all of the references that meet the filter criteria. foreach (ReferenceNode reference in source.References) { if (reference.IsInverse && request.BrowseDirection == BrowseDirection.Forward_0) { continue; } if (!reference.IsInverse && request.BrowseDirection == BrowseDirection.Inverse_1) { continue; } // the reference type filter can be an exact match or it can be for any subtype. if (reference.ReferenceTypeId != request.ReferenceTypeId) { if (!request.IncludeSubtypes) { continue; } if (!IsTypeOf(reference.ReferenceTypeId, request.ReferenceTypeId)) { continue; } } // need to look up the target to find the attributes. // note that the result filter mask is being ignored. production servers only need to // look up the attributes requested by the client. Node target = m_nodes.Find(reference.TargetId); if (target != null) { ReferenceDescription description = new ReferenceDescription(); description.NodeId = reference.TargetId; description.IsForward = !reference.IsInverse; description.ReferenceTypeId = reference.ReferenceTypeId; description.BrowseName = target.BrowseName; description.DisplayName = target.DisplayName; description.NodeClass = target.NodeClass; description.TypeDefinition = GetTypeDefinition(target); result.References.Add(description); } } } }
public override string Control(MiniWebServer.Request request, int service_index) { if (service_index >= root_device.Services.Count) return ("");//TODO put a real error message in here SubDevice.Service control_service = root_device.Services[service_index]; //Console.WriteLine("opened control url of service :" + control_service.ServiceType); //Console.WriteLine("body:" + request.Body); //Console.WriteLine("soap action:" + request.Headers.Get("SOAPACTION")); char[] trims = { '"'}; if (request.Headers.Get("SOAPACTION").Trim().Trim(trims) == "urn:schemas-upnp-org:service:ContentDirectory:1#Browse") { string soap_answer = ""; soap_answer += "<?xml version=\"1.0\" encoding=\"utf-8\"?>"; soap_answer += "<s:Envelope s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\">"; soap_answer += "<s:Body>"; soap_answer += "<u:Browse xmlns:u=\"urn:" + control_service.ServiceType + "\">"; //soap_answer += "<ObjectID>0</ObjectID>"; //soap_answer += "<BrowseFlag>BrowseDirectChildren</BrowseFlag>"; //soap_answer += "<Filter>*</Filter>"; //soap_answer += "<StartingIndex>0</StartingIndex>"; //soap_answer += "<RequestedCount>10</RequestedCount>"; //soap_answer += "<SortCriteria />"; //input values string object_id = UPnP.GetStringInbetween(request.Body, "<ObjectID>", "</ObjectID>"); string browse_flag = UPnP.GetStringInbetween(request.Body, "<BrowseFlag>", "</BrowseFlag>"); string filter = UPnP.GetStringInbetween(request.Body, "<Filter>", "</Filter>"); int starting_index = UPnP.GetIntInbetween(request.Body, "<StartingIndex>", "</StartingIndex>"); int requested_count = UPnP.GetIntInbetween(request.Body, "<RequestedCount>", "</RequestedCount>"); string sort_criteria = UPnP.GetStringInbetween(request.Body, "<SortCriteria>", "</SortCriteria>"); if (starting_index == -1) starting_index = 0; if (requested_count == -1) requested_count = 0; //output values string didl = ""; int total_matches = 0; int number_returned = 0; int update_id = 0; if (BrowseRequestReceived != null) { BrowseResult result = new BrowseResult(); result = BrowseRequestReceived(this, object_id, browse_flag, starting_index, requested_count, sort_criteria); if (result.AutoIndex) { total_matches = result.NumberReturned; didl = result.GetIndexedDidl(starting_index, requested_count); } else { didl = result.Didl; total_matches = result.TotalMatches; } didl = XmlStrings.ToXmlString(didl); number_returned = result.NumberReturned; update_id = result.UpdateID; } soap_answer += "<Result>" + didl + "</Result>"; soap_answer += "<NumberReturned>" + number_returned + "</NumberReturned>"; soap_answer += "<TotalMatches>" + total_matches + "</TotalMatches>"; soap_answer += "<UpdateID>" + update_id + "</UpdateID>"; soap_answer += "</u:Browse>"; soap_answer += "</s:Body>"; soap_answer += "</s:Envelope>"; return (soap_answer); } //TODO add a real soap error response here return(""); }
/// <summary> /// Returns the references that meet the filter criteria for one or more nodes. /// </summary> public BrowseResponseMessage Browse(BrowseMessage request) { try { lock (m_lock) { // verify the session. VerifySession(request.RequestHeader, false); // process each node being browsed. ListOfBrowseResult results = new ListOfBrowseResult(); ListOfDiagnosticInfo diagnosticInfos = new ListOfDiagnosticInfo(); for (int ii = 0; ii < request.NodesToBrowse.Count; ii++) { BrowseResult result = new BrowseResult(); DiagnosticInfo diagnosticInfo = new DiagnosticInfo(); m_nodeManager.Browse( request.NodesToBrowse[ii], result, diagnosticInfo); results.Add(result); diagnosticInfos.Add(diagnosticInfo); } // return the response. BrowseResponseMessage response = new BrowseResponseMessage(); response.ResponseHeader = CreateResponseHeader(request.RequestHeader); response.Results = results; response.DiagnosticInfos = diagnosticInfos; return response; } } catch (Exception e) { throw CreateSoapFault(request.RequestHeader, e); } }
/// <summary> /// Sends the browse request to the server. /// </summary> /// <param name="session">The session.</param> /// <param name="nodesToBrowse">The nodes to browse.</param> /// <returns></returns> private BrowseResultCollection BrowseBlock(Session session, BrowseDescriptionCollection nodesToBrowse) { try { // Utils.Trace("Browsing {0} Nodes", nodesToBrowse.Count); ViewDescription view = new ViewDescription(); Dictionary<int,BrowseResult> combinedResults = new Dictionary<int, BrowseResult>(); // initialize the table of indexes used to correlate results. BrowseDescriptionCollection browseOperations = nodesToBrowse; List<int> browseIndexes = new List<int>(); for (int ii = 0; ii < nodesToBrowse.Count; ii++) { browseIndexes.Add(ii); } BrowseDescriptionCollection unprocessedOperations = new BrowseDescriptionCollection(); List<int> unprocessedBrowseIndexes = new List<int>(); while (browseOperations.Count > 0) { // start the browse operation. BrowseResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; session.Browse( null, view, 0, browseOperations, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, browseOperations); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, browseOperations); unprocessedOperations.Clear(); unprocessedBrowseIndexes.Clear(); ByteStringCollection continuationPoints = new ByteStringCollection(); List<int> continuationPointIndexes = new List<int>(); for (int ii = 0; ii < browseOperations.Count; ii++) { int index = browseIndexes[ii]; // Utils.Trace("{0}/{1}/{2}", browseOperations[ii].NodeId, browseOperations[ii].ReferenceTypeId, results[ii].References.Count); // look up results. BrowseResult combinedResult = null; if (!combinedResults.TryGetValue(index, out combinedResult)) { combinedResults[index] = combinedResult = new BrowseResult(); } // check for error. if (StatusCode.IsBad(results[ii].StatusCode)) { // this error indicates that the server does not have enough simultaneously active // continuation points. This request will need to be resent after the other operations // have been completed and their continuation points released. if (results[ii].StatusCode == StatusCodes.BadNoContinuationPoints) { unprocessedOperations.Add(browseOperations[ii]); unprocessedBrowseIndexes.Add(index); continue; } // save error. if (StatusCode.IsGood(combinedResult.StatusCode)) { combinedResult.StatusCode = results[ii].StatusCode; } continue; } // check if all references have been fetched. if (results[ii].References.Count == 0) { continue; } // save results. combinedResult.References.AddRange(results[ii].References); // check for continuation point. if (results[ii].ContinuationPoint != null && results[ii].ContinuationPoint.Length > 0) { continuationPoints.Add(results[ii].ContinuationPoint); continuationPointIndexes.Add(index); } } // process continuation points. ByteStringCollection revisedContinuationPoints = new ByteStringCollection(); List<int> revisedContinuationPointIndexes = new List<int>(); while (continuationPoints.Count > 0) { bool releaseContinuationPoints = false; // continue browse operation. session.BrowseNext( null, releaseContinuationPoints, continuationPoints, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, continuationPoints); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, continuationPoints); revisedContinuationPoints.Clear(); revisedContinuationPointIndexes.Clear(); for (int ii = 0; ii < continuationPoints.Count; ii++) { int index = continuationPointIndexes[ii]; // look up results. BrowseResult combinedResult = null; if (!combinedResults.TryGetValue(index, out combinedResult)) { combinedResults[index] = new BrowseResult(); } // check for error. if (StatusCode.IsBad(results[ii].StatusCode)) { // save error. if (StatusCode.IsGood(combinedResult.StatusCode)) { combinedResult.StatusCode = results[ii].StatusCode; } continue; } // check if all references have been fetched. if (results[ii].References.Count == 0) { continue; } // save results. combinedResult.References.AddRange(results[ii].References); // check for continuation point. if (results[ii].ContinuationPoint != null && results[ii].ContinuationPoint.Length > 0) { revisedContinuationPoints.Add(results[ii].ContinuationPoint); revisedContinuationPointIndexes.Add(index); } } // check if browsing must continue; continuationPoints = revisedContinuationPoints; continuationPointIndexes = revisedContinuationPointIndexes; } // check if unprocessed results exist. browseOperations = unprocessedOperations; browseIndexes = unprocessedBrowseIndexes; } // reconstruct list of combined results. BrowseResultCollection finalResults = new BrowseResultCollection(); for (int ii = 0; ii < nodesToBrowse.Count; ii++) { BrowseResult combinedResult = null; if (!combinedResults.TryGetValue(ii, out combinedResult)) { combinedResult = new BrowseResult(); } finalResults.Add(combinedResult); } // return complete list. return finalResults; } catch (Exception e) { throw ComUtils.CreateComException(e, ResultIds.E_FAIL); } }
private void PopulateModelResult(Models.Search model, BrowseResult result) { // Clear the input fields model.SelectionGroups.Clear(); model.Phrase = string.Empty; // Get the facets and return them in compact format if (result.FacetMap.Count() > 0) { foreach (var map in result.FacetMap) { var group = new Models.FacetGroup(); group.Name = map.Key; foreach (var f in map.Value.GetFacets()) { var facet = new Models.Facet(); facet.Name = f.Value.ToString(); facet.Count = f.HitCount; group.Facets.Add(facet); } model.FacetGroups.Add(group); } } // Get the results foreach (var doc in result.Hits) { model.Results.Add(doc.StoredFields.GetField("title").StringValue()); } }