1 /* ***************************************************************************
2 * Copyright (c) 2012 Brabenetz Harald, Austria.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *
16 *****************************************************************************/
17
18 package org.settings4j;
19
20 import org.settings4j.settings.position.ConnectorPositionAfterFirstClass;
21 import org.settings4j.settings.position.ConnectorPositionAfterLastClass;
22 import org.settings4j.settings.position.ConnectorPositionAfterName;
23 import org.settings4j.settings.position.ConnectorPositionAtFirst;
24 import org.settings4j.settings.position.ConnectorPositionAtLast;
25 import org.settings4j.settings.position.ConnectorPositionBeforeFirstClass;
26 import org.settings4j.settings.position.ConnectorPositionBeforeLastClass;
27 import org.settings4j.settings.position.ConnectorPositionBeforeName;
28 import org.settings4j.settings.position.ConnectorPositionFirstValid;
29
30
31 /**
32 * ConnectorPostitions used for {@link Settings4jInstance#addConnector(Connector, ConnectorPosition)}.
33 * <p>
34 * <h3>Exampe Usage:</h3>
35 *
36 * <pre>
37 * --------------------------------------
38 * Connector myConnector = ...
39 * if (Settings4j.getSettings().getConnector(myConnector.getName()) == null) {
40 * Settings4j.getSettings().addConnector(myConnector, ConnectorPositions.firstValid(//
41 * ConnectorPositions.afterLast(SystemPropertyConnector.class),
42 * ConnectorPositions.atFirst() // fallback if no SystemPropertyConnector exists.
43 * )
44 * );
45 * }
46 * --------------------------------------
47 * </pre>
48 *
49 * It is even more readable with static import:
50 * <pre>
51 * --------------------------------------
52 * import static org.settings4j.ConnectorPositions.*;
53 * ..
54 * Connector myConnector = ...
55 * if (Settings4j.getSettings().getConnector(myConnector.getName()) == null) {
56 * Settings4j.getSettings().addConnector(myConnector, //
57 * firstValid(afterLast(SystemPropertyConnector.class), atFirst())
58 * );
59 * }
60 * --------------------------------------
61 * </pre>
62 *
63 * @author brabenetz
64 */
65 public final class ConnectorPositions {
66
67 /** Hide constructor (Utility Pattern). */
68 private ConnectorPositions() {
69 super();
70 }
71
72 /**
73 * @param connectorName The {@link Connector#getName()} to search for.
74 * @return {@link ConnectorPositionBeforeName}
75 */
76 public static ConnectorPosition before(final String connectorName) {
77 return new ConnectorPositionBeforeName(connectorName);
78 }
79
80 /**
81 * @param connectorClass the connector class to search in the given connectors list.
82 * @return {@link ConnectorPositionBeforeFirstClass}
83 */
84 public static ConnectorPosition beforeFirst(final Class<? extends Connector> connectorClass) {
85 return new ConnectorPositionBeforeFirstClass(connectorClass);
86 }
87
88 /**
89 * @param connectorClass the connector class to search in the given connectors list.
90 * @return {@link ConnectorPositionBeforeLastClass}
91 */
92 public static ConnectorPosition beforeLast(final Class<? extends Connector> connectorClass) {
93 return new ConnectorPositionBeforeLastClass(connectorClass);
94 }
95
96 /**
97 * @param connectorName The {@link Connector#getName()} to search for.
98 * @return {@link ConnectorPositionAfterName}
99 */
100 public static ConnectorPosition after(final String connectorName) {
101 return new ConnectorPositionAfterName(connectorName);
102 }
103
104 /**
105 * @param connectorClass the connector class to search in the given connectors list.
106 * @return {@link ConnectorPositionAfterFirstClass}
107 */
108 public static ConnectorPosition afterFirst(final Class<? extends Connector> connectorClass) {
109 return new ConnectorPositionAfterFirstClass(connectorClass);
110 }
111
112 /**
113 * @param connectorClass the connector class to search in the given connectors list.
114 * @return {@link ConnectorPositionAfterLastClass}
115 */
116 public static ConnectorPosition afterLast(final Class<? extends Connector> connectorClass) {
117 return new ConnectorPositionAfterLastClass(connectorClass);
118 }
119
120 /**
121 * @return {@link ConnectorPositionAtFirst} which always returns an valid position.
122 */
123 public static ConnectorPosition atFirst() {
124 return new ConnectorPositionAtFirst();
125 }
126
127 /**
128 * @return {@link ConnectorPositionAtLast} which always returns an valid position.
129 */
130 public static ConnectorPosition atLast() {
131 return new ConnectorPositionAtLast();
132 }
133
134 /**
135 * @param connectorPosition the {@link ConnectorPosition}s to search for a valid position.
136 * @return ConnectorPositionFirstValid
137 */
138 public static ConnectorPosition firstValid(final ConnectorPosition... connectorPosition) {
139 return new ConnectorPositionFirstValid(connectorPosition);
140 }
141 }