PageRenderTime 54ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/jboss-as-7.1.1.Final/controller/src/main/java/org/jboss/as/controller/descriptions/common/InterfaceDescription.java

#
Java | 379 lines | 278 code | 43 blank | 58 comment | 18 complexity | 22aa238e64650b7f099335506f582e58 MD5 | raw file
Possible License(s): LGPL-2.1, Apache-2.0
  1. /*
  2. * JBoss, Home of Professional Open Source.
  3. * Copyright 2011, Red Hat, Inc., and individual contributors
  4. * as indicated by the @author tags. See the copyright.txt file in the
  5. * distribution for a full listing of individual contributors.
  6. *
  7. * This is free software; you can redistribute it and/or modify it
  8. * under the terms of the GNU Lesser General Public License as
  9. * published by the Free Software Foundation; either version 2.1 of
  10. * the License, or (at your option) any later version.
  11. *
  12. * This software is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with this software; if not, write to the Free
  19. * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  20. * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
  21. */
  22. package org.jboss.as.controller.descriptions.common;
  23. import static org.jboss.as.controller.ControllerMessages.MESSAGES;
  24. import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ADD;
  25. import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ALTERNATIVES;
  26. import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.DESCRIPTION;
  27. import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.HEAD_COMMENT_ALLOWED;
  28. import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OPERATION_NAME;
  29. import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.REMOVE;
  30. import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.REPLY_PROPERTIES;
  31. import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.REQUEST_PROPERTIES;
  32. import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.TAIL_COMMENT_ALLOWED;
  33. import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.VALUE_TYPE;
  34. import java.util.Arrays;
  35. import java.util.HashSet;
  36. import java.util.Locale;
  37. import java.util.ResourceBundle;
  38. import java.util.Set;
  39. import javax.xml.stream.XMLStreamException;
  40. import javax.xml.stream.XMLStreamWriter;
  41. import org.jboss.as.controller.AttributeDefinition;
  42. import org.jboss.as.controller.ListAttributeDefinition;
  43. import org.jboss.as.controller.OperationFailedException;
  44. import org.jboss.as.controller.SimpleAttributeDefinitionBuilder;
  45. import org.jboss.as.controller.client.helpers.MeasurementUnit;
  46. import org.jboss.as.controller.descriptions.ModelDescriptionConstants;
  47. import org.jboss.as.controller.descriptions.ResourceDescriptionResolver;
  48. import org.jboss.as.controller.operations.validation.ModelTypeValidator;
  49. import org.jboss.as.controller.operations.validation.ParameterValidator;
  50. import org.jboss.as.controller.parsing.Element;
  51. import org.jboss.as.controller.registry.AttributeAccess;
  52. import org.jboss.dmr.ModelNode;
  53. import org.jboss.dmr.ModelType;
  54. /**
  55. * Model descriptions for interface elements.
  56. *
  57. * @author Brian Stansberry
  58. * @author Emanuel Muckenhuber
  59. */
  60. public class InterfaceDescription {
  61. private static final String RESOURCE_NAME = InterfaceDescription.class.getPackage().getName() + ".LocalDescriptions";
  62. public static ModelNode getNamedInterfaceDescription(final Locale locale) {
  63. final ResourceBundle bundle = getResourceBundle(locale);
  64. final ModelNode root = new ModelNode();
  65. root.get(DESCRIPTION).set(bundle.getString("named_interface"));
  66. NAME.addResourceAttributeDescription(bundle, "interface", root);
  67. populateInterface(root, bundle, false);
  68. return root;
  69. }
  70. public static ModelNode getSpecifiedInterfaceDescription(final Locale locale) {
  71. final ResourceBundle bundle = getResourceBundle(locale);
  72. final ModelNode root = new ModelNode();
  73. root.get(DESCRIPTION).set(bundle.getString("specified_interface"));
  74. NAME.addResourceAttributeDescription(bundle, "interface", root);
  75. populateInterface(root, bundle, true);
  76. return root;
  77. }
  78. private static void populateInterface(ModelNode root, ResourceBundle bundle, boolean specified) {
  79. root.get(HEAD_COMMENT_ALLOWED).set(true);
  80. root.get(TAIL_COMMENT_ALLOWED).set(false);
  81. // Add the interface criteria operation params
  82. for(final AttributeDefinition def : ROOT_ATTRIBUTES) {
  83. def.addResourceAttributeDescription(bundle, "interface", root);
  84. }
  85. }
  86. public static ModelNode getNamedInterfaceAddOperation(final Locale locale) {
  87. final ResourceBundle bundle = getResourceBundle(locale);
  88. final ModelNode root = new ModelNode();
  89. root.get(OPERATION_NAME).set(ADD);
  90. root.get(DESCRIPTION).set(bundle.getString("interface.add"));
  91. // Add the interface criteria attributes
  92. for(final AttributeDefinition def : ROOT_ATTRIBUTES) {
  93. def.addOperationParameterDescription(bundle, "interface", root);
  94. }
  95. return root;
  96. }
  97. public static ModelNode getSpecifiedInterfaceAddOperation(final Locale locale) {
  98. final ResourceBundle bundle = getResourceBundle(locale);
  99. final ModelNode root = new ModelNode();
  100. root.get(OPERATION_NAME).set(ADD);
  101. root.get(DESCRIPTION).set(bundle.getString("interface.add"));
  102. // Add the interface criteria attributes
  103. for(final AttributeDefinition def : ROOT_ATTRIBUTES) {
  104. def.addOperationParameterDescription(bundle, "interface", root);
  105. }
  106. return root;
  107. }
  108. public static ModelNode getInterfaceRemoveOperation(final Locale locale) {
  109. final ResourceBundle bundle = getResourceBundle(locale);
  110. final ModelNode root = new ModelNode();
  111. root.get(OPERATION_NAME).set(REMOVE);
  112. root.get(DESCRIPTION).set(bundle.getString("interface.remove"));
  113. root.get(REQUEST_PROPERTIES).setEmptyObject();
  114. root.get(REPLY_PROPERTIES).setEmptyObject();
  115. return root;
  116. }
  117. private static ResourceBundle getResourceBundle(Locale locale) {
  118. if (locale == null) {
  119. locale = Locale.getDefault();
  120. }
  121. return ResourceBundle.getBundle(RESOURCE_NAME, locale);
  122. }
  123. /**
  124. * Test whether the operation has a defined criteria attribute.
  125. *
  126. * @param operation the operation
  127. * @return
  128. */
  129. public static boolean isOperationDefined(final ModelNode operation) {
  130. for(final AttributeDefinition def : ROOT_ATTRIBUTES) {
  131. if(operation.hasDefined(def.getName())) {
  132. return true;
  133. }
  134. }
  135. return false;
  136. }
  137. /** The any-* alternatives. */
  138. private static final String[] ALTERNATIVES_ANY = new String[] { ModelDescriptionConstants.ANY_ADDRESS, ModelDescriptionConstants.ANY_IPV4_ADDRESS, ModelDescriptionConstants.ANY_IPV6_ADDRESS};
  139. /** All other attribute names. */
  140. private static final String[] OTHERS = new String[] { localName(Element.INET_ADDRESS), localName(Element.LINK_LOCAL_ADDRESS),
  141. localName(Element.LOOPBACK), localName(Element.LOOPBACK_ADDRESS), localName(Element.MULTICAST), localName(Element.NIC),
  142. localName(Element.NIC_MATCH), localName(Element.POINT_TO_POINT), localName(Element.PUBLIC_ADDRESS), localName(Element.SITE_LOCAL_ADDRESS),
  143. localName(Element.SUBNET_MATCH), localName(Element.UP), localName(Element.VIRTUAL),
  144. localName(Element.ANY), localName(Element.NOT)
  145. };
  146. public static final AttributeDefinition NAME = SimpleAttributeDefinitionBuilder.create(ModelDescriptionConstants.NAME, ModelType.STRING)
  147. .build();
  148. public static final AttributeDefinition ANY_ADDRESS = SimpleAttributeDefinitionBuilder.create(ModelDescriptionConstants.ANY_ADDRESS, ModelType.BOOLEAN)
  149. .setAllowExpression(false).setAllowNull(false).setRestartAllServices()
  150. .setValidator(new ModelTypeValidator(ModelType.BOOLEAN, true, true))
  151. .addAlternatives(OTHERS).addAlternatives(ModelDescriptionConstants.ANY_IPV4_ADDRESS, ModelDescriptionConstants.ANY_IPV6_ADDRESS)
  152. .build();
  153. public static final AttributeDefinition ANY_IPV4_ADDRESS = SimpleAttributeDefinitionBuilder.create(ModelDescriptionConstants.ANY_IPV4_ADDRESS, ModelType.BOOLEAN)
  154. .setAllowExpression(false).setAllowNull(false).setRestartAllServices()
  155. .setValidator(new ModelTypeValidator(ModelType.BOOLEAN, true, true))
  156. .addAlternatives(OTHERS).addAlternatives(ModelDescriptionConstants.ANY_ADDRESS, ModelDescriptionConstants.ANY_IPV6_ADDRESS)
  157. .build();
  158. public static final AttributeDefinition ANY_IPV6_ADDRESS = SimpleAttributeDefinitionBuilder.create(ModelDescriptionConstants.ANY_IPV6_ADDRESS, ModelType.BOOLEAN)
  159. .setAllowExpression(false).setAllowNull(false).setRestartAllServices()
  160. .setValidator(new ModelTypeValidator(ModelType.BOOLEAN, true, true))
  161. .addAlternatives(OTHERS).addAlternatives(ModelDescriptionConstants.ANY_ADDRESS, ModelDescriptionConstants.ANY_IPV4_ADDRESS)
  162. .build();
  163. public static final AttributeDefinition INET_ADDRESS = SimpleAttributeDefinitionBuilder.create(ModelDescriptionConstants.INET_ADDRESS, ModelType.STRING)
  164. .setAllowExpression(true).setAllowNull(true).addAlternatives(ALTERNATIVES_ANY).setRestartAllServices()
  165. .build();
  166. public static final AttributeDefinition LINK_LOCAL_ADDRESS = SimpleAttributeDefinitionBuilder.create(localName(Element.LINK_LOCAL_ADDRESS), ModelType.BOOLEAN)
  167. .setAllowExpression(false).setAllowNull(true).addAlternatives(ALTERNATIVES_ANY).setRestartAllServices()
  168. .build();
  169. public static final AttributeDefinition LOOPBACK = SimpleAttributeDefinitionBuilder.create(localName(Element.LOOPBACK), ModelType.BOOLEAN)
  170. .setAllowExpression(false).setAllowNull(true).addAlternatives(ALTERNATIVES_ANY).setRestartAllServices()
  171. .build();
  172. public static final AttributeDefinition LOOPBACK_ADDRESS = SimpleAttributeDefinitionBuilder.create(localName(Element.LOOPBACK_ADDRESS), ModelType.STRING)
  173. .setAllowExpression(true).setAllowNull(true).addAlternatives(ALTERNATIVES_ANY).setRestartAllServices()
  174. .build();
  175. public static final AttributeDefinition NIC = SimpleAttributeDefinitionBuilder.create(localName(Element.NIC), ModelType.STRING)
  176. .setAllowExpression(true).setAllowNull(true).addAlternatives(ALTERNATIVES_ANY).setRestartAllServices()
  177. .build();
  178. public static final AttributeDefinition NIC_MATCH = SimpleAttributeDefinitionBuilder.create(localName(Element.NIC_MATCH), ModelType.STRING)
  179. .setAllowExpression(true).setAllowNull(true).addAlternatives(ALTERNATIVES_ANY).setRestartAllServices()
  180. .build();
  181. public static final AttributeDefinition MULTICAST = SimpleAttributeDefinitionBuilder.create(localName(Element.MULTICAST), ModelType.BOOLEAN)
  182. .setAllowExpression(false).setAllowNull(true).addAlternatives(ALTERNATIVES_ANY).setRestartAllServices()
  183. .build();
  184. public static final AttributeDefinition POINT_TO_POINT = SimpleAttributeDefinitionBuilder.create(localName(Element.POINT_TO_POINT), ModelType.BOOLEAN)
  185. .setAllowExpression(false).setAllowNull(true).addAlternatives(ALTERNATIVES_ANY).setRestartAllServices()
  186. .build();
  187. public static final AttributeDefinition PUBLIC_ADDRESS = SimpleAttributeDefinitionBuilder.create(localName(Element.PUBLIC_ADDRESS), ModelType.BOOLEAN)
  188. .setAllowExpression(false).setAllowNull(true).addAlternatives(ALTERNATIVES_ANY).setRestartAllServices()
  189. .build();
  190. public static final AttributeDefinition SITE_LOCAL_ADDRESS = SimpleAttributeDefinitionBuilder.create(localName(Element.SITE_LOCAL_ADDRESS), ModelType.BOOLEAN)
  191. .setAllowExpression(false).setAllowNull(true).addAlternatives(ALTERNATIVES_ANY).setRestartAllServices()
  192. .build();
  193. public static final AttributeDefinition SUBNET_MATCH = SimpleAttributeDefinitionBuilder.create(localName(Element.SUBNET_MATCH), ModelType.STRING)
  194. .setAllowExpression(true).setAllowNull(true).addAlternatives(ALTERNATIVES_ANY).setRestartAllServices()
  195. .build();
  196. public static final AttributeDefinition UP = SimpleAttributeDefinitionBuilder.create(localName(Element.UP), ModelType.BOOLEAN)
  197. .setAllowExpression(false).setAllowNull(true).addAlternatives(ALTERNATIVES_ANY).setRestartAllServices()
  198. .build();
  199. public static final AttributeDefinition VIRTUAL = SimpleAttributeDefinitionBuilder.create(localName(Element.VIRTUAL), ModelType.BOOLEAN)
  200. .setAllowExpression(false).setAllowNull(true).addAlternatives(ALTERNATIVES_ANY).setRestartAllServices()
  201. .build();
  202. public static final AttributeDefinition NOT = createNestedComplexType("not");
  203. public static final AttributeDefinition ANY = createNestedComplexType("any");
  204. /** The root attributes. */
  205. public static final AttributeDefinition[] ROOT_ATTRIBUTES = new AttributeDefinition[] {
  206. ANY_ADDRESS, ANY_IPV4_ADDRESS, ANY_IPV6_ADDRESS, INET_ADDRESS, LINK_LOCAL_ADDRESS,
  207. LOOPBACK, LOOPBACK_ADDRESS, MULTICAST, NIC, NIC_MATCH, POINT_TO_POINT, PUBLIC_ADDRESS,
  208. SITE_LOCAL_ADDRESS, SUBNET_MATCH, UP, VIRTUAL, ANY, NOT
  209. };
  210. /** The nested attributes for any, not. */
  211. public static final AttributeDefinition[] NESTED_ATTRIBUTES = new AttributeDefinition[] {
  212. INET_ADDRESS, LINK_LOCAL_ADDRESS, LOOPBACK, LOOPBACK_ADDRESS, MULTICAST, NIC,
  213. NIC_MATCH, POINT_TO_POINT, PUBLIC_ADDRESS, SITE_LOCAL_ADDRESS, SUBNET_MATCH, UP, VIRTUAL
  214. };
  215. public static final Set<AttributeDefinition> NESTED_LIST_ATTRIBUTES = new HashSet<AttributeDefinition>(
  216. Arrays.asList(INET_ADDRESS, NIC, NIC_MATCH, SUBNET_MATCH )
  217. );
  218. /** The wildcard criteria attributes */
  219. public static final AttributeDefinition[] WILDCARD_ATTRIBUTES = new AttributeDefinition[] {ANY_ADDRESS, ANY_IPV4_ADDRESS, ANY_IPV6_ADDRESS };
  220. public static final AttributeDefinition[] SIMPLE_ATTRIBUTES = new AttributeDefinition[] { LINK_LOCAL_ADDRESS, LOOPBACK,
  221. MULTICAST, POINT_TO_POINT, PUBLIC_ADDRESS, SITE_LOCAL_ADDRESS, UP, VIRTUAL };
  222. /**
  223. * Create the AttributeDefinition for the nested 'not' / 'any' type.
  224. *
  225. * @param name the name
  226. * @return the attribute definition
  227. */
  228. private static AttributeDefinition createNestedComplexType(final String name) {
  229. return new AttributeDefinition(name, name, null, ModelType.OBJECT, true, false, MeasurementUnit.NONE, createNestedParamValidator(), ALTERNATIVES_ANY, null, AttributeAccess.Flag.RESTART_ALL_SERVICES) {
  230. @Override
  231. public void marshallAsElement(ModelNode resourceModel, XMLStreamWriter writer) throws XMLStreamException {
  232. throw new UnsupportedOperationException();
  233. }
  234. @Override
  235. public ModelNode addResourceAttributeDescription(final ResourceBundle bundle, final String prefix, final ModelNode resourceDescription) {
  236. final ModelNode result = super.addResourceAttributeDescription(bundle, prefix, resourceDescription);
  237. addNestedDescriptions(result, prefix, bundle);
  238. return result;
  239. }
  240. @Override
  241. public ModelNode addOperationParameterDescription(ResourceBundle bundle, String prefix, ModelNode operationDescription) {
  242. final ModelNode result = super.addOperationParameterDescription(bundle, prefix, operationDescription); //To change body of overridden methods use File | Settings | File Templates.
  243. addNestedDescriptions(result, prefix, bundle);
  244. return result;
  245. }
  246. void addNestedDescriptions(final ModelNode result, final String prefix, final ResourceBundle bundle) {
  247. for(final AttributeDefinition def : NESTED_ATTRIBUTES) {
  248. final String bundleKey = prefix == null ? def.getName() : (prefix + "." + def.getName());
  249. result.get(VALUE_TYPE, def.getName(), DESCRIPTION).set(bundle.getString(bundleKey));
  250. }
  251. }
  252. @Override
  253. public ModelNode getNoTextDescription(boolean forOperation) {
  254. final ModelNode model = super.getNoTextDescription(forOperation);
  255. final ModelNode valueType = model.get(VALUE_TYPE);
  256. for(final AttributeDefinition def : NESTED_ATTRIBUTES) {
  257. final AttributeDefinition current;
  258. if(NESTED_LIST_ATTRIBUTES.contains(def)) {
  259. current = wrapAsList(def);
  260. } else {
  261. current = def;
  262. }
  263. final ModelNode m = current.getNoTextDescription(forOperation);
  264. m.remove(ALTERNATIVES);
  265. valueType.get(current.getName()).set(m);
  266. }
  267. return model;
  268. }
  269. };
  270. }
  271. /**
  272. * Wrap a simple attribute def as list.
  273. *
  274. * @param def the attribute definition
  275. * @return the list attribute def
  276. */
  277. private static ListAttributeDefinition wrapAsList(final AttributeDefinition def) {
  278. final ListAttributeDefinition list = new ListAttributeDefinition(def.getName(), true, def.getValidator()) {
  279. @Override
  280. public ModelNode getNoTextDescription(boolean forOperation) {
  281. final ModelNode model = super.getNoTextDescription(forOperation);
  282. setValueType(model);
  283. return model;
  284. }
  285. @Override
  286. protected void addValueTypeDescription(final ModelNode node, final ResourceBundle bundle) {
  287. setValueType(node);
  288. }
  289. @Override
  290. public void marshallAsElement(final ModelNode resourceModel, final XMLStreamWriter writer) throws XMLStreamException {
  291. throw new RuntimeException();
  292. }
  293. @Override
  294. protected void addAttributeValueTypeDescription(ModelNode node, ResourceDescriptionResolver resolver, Locale locale, ResourceBundle bundle) {
  295. setValueType(node);
  296. }
  297. @Override
  298. protected void addOperationParameterValueTypeDescription(ModelNode node, String operationName, ResourceDescriptionResolver resolver, Locale locale, ResourceBundle bundle) {
  299. setValueType(node);
  300. }
  301. private void setValueType(ModelNode node) {
  302. node.get(ModelDescriptionConstants.VALUE_TYPE).set(ModelType.STRING);
  303. }
  304. };
  305. return list;
  306. }
  307. /**
  308. * Create the nested complex attribute parameter validator.
  309. *
  310. * @return the parameter validator
  311. */
  312. static ParameterValidator createNestedParamValidator() {
  313. return new ModelTypeValidator(ModelType.OBJECT, true, false, true) {
  314. @Override
  315. public void validateParameter(final String parameterName, final ModelNode value) throws OperationFailedException {
  316. super.validateParameter(parameterName, value);
  317. for(final AttributeDefinition def : NESTED_ATTRIBUTES) {
  318. final String name = def.getName();
  319. if(value.hasDefined(name)) {
  320. final ModelNode v = value.get(name);
  321. if(NESTED_LIST_ATTRIBUTES.contains(def)) {
  322. if (ModelType.LIST != v.getType()) {
  323. throw new OperationFailedException(new ModelNode().set(MESSAGES.invalidType(v.getType())));
  324. }
  325. } else {
  326. def.getValidator().validateParameter(name, v);
  327. }
  328. }
  329. }
  330. }
  331. };
  332. }
  333. static String localName(final Element element) {
  334. return element.getLocalName();
  335. }
  336. }