View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.eclipse.aether;
20  
21  /**
22   * A trace of nested requests that are performed by the repository system. This trace information can be used to
23   * correlate repository events with higher level operations in the application code that eventually caused the events. A
24   * single trace can carry an arbitrary object as data which is meant to describe a request/operation that is currently
25   * executed. For call hierarchies within the repository system itself, this data will usually be the {@code *Request}
26   * object that is currently processed. When invoking methods on the repository system, client code may provide a request
27   * trace that has been prepopulated with whatever data is useful for the application to indicate its state for later
28   * evaluation when processing the repository events.
29   *
30   * @see RepositoryEvent#getTrace()
31   */
32  public class RequestTrace {
33  
34      private final RequestTrace parent;
35  
36      private final Object data;
37  
38      /**
39       * Creates a child of the specified request trace. This method is basically a convenience that will invoke
40       * {@link RequestTrace#newChild(Object) parent.newChild()} when the specified parent trace is not {@code null} or
41       * otherwise instantiante a new root trace.
42       *
43       * @param parent The parent request trace, may be {@code null}.
44       * @param data The data to associate with the child trace, may be {@code null}.
45       * @return The child trace, never {@code null}.
46       */
47      public static RequestTrace newChild(RequestTrace parent, Object data) {
48          if (parent == null) {
49              return new RequestTrace(data);
50          }
51          return parent.newChild(data);
52      }
53  
54      /**
55       * Creates a new root trace with the specified data.
56       *
57       * @param data The data to associate with the trace, may be {@code null}.
58       */
59      public RequestTrace(Object data) {
60          this(null, data);
61      }
62  
63      /**
64       * Creates a new trace with the specified data and parent
65       *
66       * @param parent The parent trace, may be {@code null} for a root trace.
67       * @param data The data to associate with the trace, may be {@code null}.
68       */
69      protected RequestTrace(RequestTrace parent, Object data) {
70          this.parent = parent;
71          this.data = data;
72      }
73  
74      /**
75       * Gets the data associated with this trace.
76       *
77       * @return The data associated with this trace or {@code null} if none.
78       */
79      public final Object getData() {
80          return data;
81      }
82  
83      /**
84       * Gets the parent of this trace.
85       *
86       * @return The parent of this trace or {@code null} if this is the root of the trace stack.
87       */
88      public final RequestTrace getParent() {
89          return parent;
90      }
91  
92      /**
93       * Creates a new child of this trace.
94       *
95       * @param data The data to associate with the child, may be {@code null}.
96       * @return The child trace, never {@code null}.
97       */
98      public RequestTrace newChild(Object data) {
99          return new RequestTrace(this, data);
100     }
101 
102     @Override
103     public String toString() {
104         return String.valueOf(getData());
105     }
106 }