View Javadoc
1   /*-
2    * #%L
3    * io.earcam.instrumental.module.osgi
4    * %%
5    * Copyright (C) 2018 earcam
6    * %%
7    * SPDX-License-Identifier: (BSD-3-Clause OR EPL-1.0 OR Apache-2.0 OR MIT)
8    * 
9    * You <b>must</b> choose to accept, in full - any individual or combination of 
10   * the following licenses:
11   * <ul>
12   * 	<li><a href="https://opensource.org/licenses/BSD-3-Clause">BSD-3-Clause</a></li>
13   * 	<li><a href="https://www.eclipse.org/legal/epl-v10.html">EPL-1.0</a></li>
14   * 	<li><a href="https://www.apache.org/licenses/LICENSE-2.0">Apache-2.0</a></li>
15   * 	<li><a href="https://opensource.org/licenses/MIT">MIT</a></li>
16   * </ul>
17   * #L%
18   */
19  package io.earcam.instrumental.module.osgi;
20  
21  import static io.earcam.instrumental.fluent.Role.AUX;
22  import static io.earcam.instrumental.module.osgi.ClauseParameters.EMPTY_PARAMETERS;
23  import static java.util.stream.Collectors.joining;
24  
25  import java.io.IOException;
26  import java.util.Arrays;
27  import java.util.List;
28  import java.util.Objects;
29  import java.util.SortedSet;
30  import java.util.TreeSet;
31  
32  import javax.annotation.ParametersAreNonnullByDefault;
33  
34  import io.earcam.instrumental.fluent.Fluent;
35  import io.earcam.unexceptional.Exceptional;
36  
37  /**
38   * <p>
39   * Clause class.
40   * </p>
41   *
42   */
43  @ParametersAreNonnullByDefault
44  public class Clause {
45  
46  	private final SortedSet<String> uniqueNames;
47  	private final ClauseParameters parameters;
48  
49  
50  	/**
51  	 * <p>
52  	 * Constructor for Clause.
53  	 * </p>
54  	 *
55  	 * @param uniqueName a {@link java.lang.String} object.
56  	 * @param parameters a {@link io.earcam.instrumental.module.osgi.ClauseParameters} object.
57  	 */
58  	public Clause(String uniqueName, ClauseParameters parameters)
59  	{
60  		uniqueNames = new TreeSet<>();
61  		uniqueNames.add(uniqueName);
62  		this.parameters = parameters;
63  	}
64  
65  
66  	/**
67  	 * <p>
68  	 * Constructor for Clause.
69  	 * </p>
70  	 *
71  	 * @param uniqueNames a {@link java.util.SortedSet} object.
72  	 * @param parameters a {@link io.earcam.instrumental.module.osgi.ClauseParameters} object.
73  	 */
74  	public Clause(SortedSet<String> uniqueNames, ClauseParameters parameters)
75  	{
76  		this.uniqueNames = uniqueNames;
77  		this.parameters = parameters;
78  	}
79  
80  
81  	/**
82  	 * <p>
83  	 * clause.
84  	 * </p>
85  	 *
86  	 * @param uniqueName a {@link java.lang.String} object.
87  	 * @return a {@link io.earcam.instrumental.module.osgi.Clause} object.
88  	 */
89  	public static Clause clause(String uniqueName)
90  	{
91  		return clause(uniqueName, EMPTY_PARAMETERS);
92  	}
93  
94  
95  	/**
96  	 * <p>
97  	 * clause.
98  	 * </p>
99  	 *
100 	 * @param uniqueName a {@link java.lang.String} object.
101 	 * @param parameters a {@link io.earcam.instrumental.module.osgi.ClauseParameters} object.
102 	 * @return a {@link io.earcam.instrumental.module.osgi.Clause} object.
103 	 */
104 	public static Clause clause(String uniqueName, ClauseParameters parameters)
105 	{
106 		return new Clause(uniqueName, parameters);
107 	}
108 
109 
110 	/**
111 	 * <p>
112 	 * sortedSet.
113 	 * </p>
114 	 *
115 	 * @param elements a T object.
116 	 * @param <T> a T object.
117 	 * @return a {@link java.util.SortedSet} object.
118 	 */
119 	@Fluent(role = AUX)
120 	public static SortedSet<String> sortedSet(String... elements)
121 	{
122 		return new TreeSet<>(Arrays.asList(elements));
123 	}
124 
125 
126 	@Override
127 	public String toString()
128 	{
129 		return Exceptional.apply(this::appendTo, new StringBuilder()).toString();
130 	}
131 
132 
133 	@Override
134 	public boolean equals(Object other)
135 	{
136 		return other instanceof Clause && equals((Clause) other);
137 	}
138 
139 
140 	/**
141 	 * <p>
142 	 * equals.
143 	 * </p>
144 	 *
145 	 * @param that a {@link io.earcam.instrumental.module.osgi.Clause} object.
146 	 * @return a boolean.
147 	 */
148 	@SuppressWarnings("squid:S2589")  // SonarQube false positive - "that" could clearly be null
149 	public boolean equals(Clause that)
150 	{
151 		return that != null
152 				// && that.uniqueNames().equals(this.uniqueNames)
153 				&& that.uniqueNames().size() == this.uniqueNames.size()
154 				&& that.uniqueNames().containsAll(this.uniqueNames)
155 				&& that.parameters().equals(this.parameters);
156 	}
157 
158 
159 	@Override
160 	public int hashCode()
161 	{
162 		return Objects.hash(uniqueNames, parameters);
163 	}
164 
165 
166 	/**
167 	 * <p>
168 	 * uniqueNames.
169 	 * </p>
170 	 *
171 	 * @return a {@link java.util.SortedSet} object.
172 	 */
173 	public SortedSet<String> uniqueNames()
174 	{
175 		return uniqueNames;
176 	}
177 
178 
179 	/**
180 	 * <p>
181 	 * parameters.
182 	 * </p>
183 	 *
184 	 * @return a {@link io.earcam.instrumental.module.osgi.ClauseParameters} object.
185 	 */
186 	public ClauseParameters parameters()
187 	{
188 		return parameters;
189 	}
190 
191 
192 	/**
193 	 * <p>
194 	 * appendTo.
195 	 * </p>
196 	 *
197 	 * @param appendix a {@link java.lang.Appendable} object.
198 	 * @return a {@link java.lang.Appendable} object.
199 	 * @throws java.io.IOException if any.
200 	 */
201 	public Appendable appendTo(Appendable appendix) throws IOException
202 	{
203 		appendix.append(uniqueNames().stream().collect(joining(";")));
204 		return parameters.appendTo(appendix);
205 	}
206 
207 
208 	public static String allToString(List<Clause> clauses)
209 	{
210 		StringBuilder santa = new StringBuilder();
211 		for(int i = 0; i < clauses.size(); i++) {
212 			Exceptional.accept(clauses.get(i)::appendTo, santa);
213 			if(i < clauses.size() - 1) {
214 				santa.append(',');
215 			}
216 		}
217 		return santa.toString();
218 	}
219 }