/* * RHQ Management Platform * Copyright (C) 2005-2008 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License, version 2, as * published by the Free Software Foundation, and/or the GNU Lesser * General Public License, version 2.1, also as published by the Free * Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License and the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU General Public License * and the GNU Lesser General Public License along with this program; * if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package org.rhq.core.domain.configuration.test; import org.testng.annotations.Test; import org.rhq.core.domain.configuration.Configuration; import org.rhq.core.domain.configuration.PropertyMap; import org.rhq.core.domain.configuration.PropertySimple; public class DataSourceExample { /* This class exercises the Configuration domain model from a number of different actors and goals. * The following summary describes the different use cases of the domain model: * * 1. Plugin populating a value set to describe the resource's current state 2. Plugin reading a value set to write * the changes to the resource 3. Plugin Container creating a definition 4. Server storing a value set to the * database 5. Server storing a definition to the database 6. Server rendering a edit properties form for a new * resource (just uses definition) 7. Server rendering an edit properties form with existing resource properties * * The following methods attempt to simulate such usage in each of these cases. * */ @Test public Configuration sampleValueSetDemonstration() { Configuration configuration = new Configuration(); configuration.put(new PropertySimple("jndi-name", "DefaultDS")); configuration.put(new PropertySimple("connection-url", "jdbc:postgresql://localhost:9432/rhq14?protocolVersion=2")); configuration.put(new PropertySimple("use-java-context", Boolean.TRUE)); configuration.put(new PropertySimple("min-pool-size", 2)); configuration.put(new PropertySimple("max-pool-size", null)); configuration.put(new PropertySimple("track-statements", "Yes")); PropertyMap connectionProperties = new PropertyMap("connection-properties"); connectionProperties.put(new PropertySimple("TNSNamesFile", "c:\\temp\\tnsnames.ora")); connectionProperties.put(new PropertySimple("ConnectionRetryDelay", "3")); configuration.put(connectionProperties); return configuration; } /* * @Test public void renderCreatePageDemo() { PropertyValueSet valueSet = new PropertyValueSet(); * ConfigurationDefinition defn = new ConfigurationDefinition(); * * // NOTE: the trouble with returning a Set of names is that we probably lose the ordering // of the properties * which we once had. May be a list would be better. We could always // use the orderIndex on the returned * ConfigurationProperty but i'd prefer just to fetch // things in the correct order // ccrouch, Dec 4, 2006 * * // NOTE: iterating through the groups is not helpful since we can't iterate through the // properties contained * in a group // ccrouch, Dec 4,2006 for (String groupName : defn.groupNameSet()) { PropertyGroup group = * defn.getPropertyGroup(groupName); //group.getPropertyNames() } * * // at some level of rendering we're going to want to convert properties into // widgets we can display. // * This widget stuff is all pie-in-the-sky until we get the UI rendering // nailed down more, its just trying to * exercise the configurationDefinition. List widgets = new ArrayList(); * * for (String propName : defn.propertyNameSet()) { // NOTE: we really need a * ConfigurationDefinition.getProperty which returns // a ConfigurationProperty, since for a given property * name we're not going // to know what sort of property it is. Just upcast to ConfigurationProperty // * for now, to mimic this method. ConfigurationProperty prop = defn.getCompositeProperty(propName); * * // don't see any way to avoid this in the general case where we don't know the types // of the properties * we are retrieving. if (prop instanceof CompositeProperty) { CompositeProperty compositeProperty * = (CompositeProperty) prop; Object parentWidget; if (compositeProperty.isMultiplicity()) * { // make sure to display a list of CompositeProperty widgets parentWidget = new Object(); * // new MultiValuedCompositeWidget(); } else { parentWidget = new Object(); // * new SingleValuedCompositeWidget(); } * * // now lets see what properties will go into this parent List childWidgets = new ArrayList(); * for (SimpleProperty childProp : compositeProperty.getProperties()) { String type = * childProp.getPropertyType(); // e.g. "integer" * * Object widget = new Object(); // WidgetFactory.getWidget(type) childWidgets.add(widget); * * // if this was an edit page we'd need the value of the property too SimpleValue value = * valueSet.getSimpleValue(childProp.getName()); // widget.setValue(value.getValue) } * * // parentWidget.addChildren(childWidgets); * * widgets.add(parentWidget); } else // SimpleProperty { SimpleProperty simpleProperty * = (SimpleProperty) prop; String type = simpleProperty.getPropertyType(); // e.g. "integer" * * // this next stuff is all pie-in-the-sky until we get the UI rendering nailed down more * * Object widget = new Object(); // WidgetFactory.getWidget(type) * * // if this was an edit page we'd need the value of the property too SimpleValue value = * valueSet.getSimpleValue(simpleProperty.getName()); // widget.setValue(value.getValue) * * widgets.add(widget); } } * * // render(widgets) * * } * */ /** * Overview Numbers: 2 * Actor: Plugin * Description: Extract values from a value set and use them in configuring the resource. */ /* * @Test public void populateResourceWithValues() { */ /* Value Set is sent from the server and arrives in the plugin code. */ /* * PropertyValueSet valueSet = sampleValueSetDemonstration(); * */ /* If the operation is to create a new datasource, the entire -ds.xml file will * be created and written out. xmlWriter below refers to some form of XML package;println is used as placeholders * here. */ /* * PrintStream xmlWriter = System.out; * * xmlWriter.println("<datasources>"); * */ /* Decide what type of datasource to create. This is currently not the cleanest looking descision, *and we need to investigate utilities to make this cleaner. */ /* * CompositeValue dsRootValue; * * if ((dsRootValue = valueSet.getCompositeValue("no-tx-ds")) != null) { xmlWriter.println("<no-tx-datasource>"); * * xmlWriter.println("<jndi-name>" + dsRootValue.get("jndi-name") + "</jndi-name>"); * xmlWriter.println("<connection-url>" + dsRootValue.get("connection-url") + "</connection-url>"); * */ /* Demonstrates using a boolean type. The null check ensures that the user entered a value. * If the user did not enter a value, the entire XML tag would be omitted. If the user did enter a value, the tag is * written with the value. * * If the property was defined as required, the null check could be skipped as the userwill have been required to * enter a value of true or false. */ /* * SimpleValue javaContextValue = dsRootValue.get("use-java-context"); if (javaContextValue.getBoolean() != null) { * xmlWriter.println("<use-java-context>" + javaContextValue.getBoolean() + "</use-java-context>"); } * */ /* Demonstrates plugin-side validation. The min and max pool sizes are checked for logical * consistency. The API will include a mechanism for specifying there was an error in thisvalidation. */ /* * Integer minPoolSize = dsRootValue.get("min-pool-size").getInteger(); Integer maxPoolSize = * dsRootValue.get("max-pool-size").getInteger(); * */ /* The pool size variables are not required and therefor null checks are necessary. */ /* * if (minPoolSize != null && maxPoolSize != null && minPoolSize > maxPoolSize) { */ /* Add to running list of issues with the value set, to be returned to the server. */ /* * } * */ /* There are no checks to ensure the pool size is greater than 0 as the integer range *constraint will ensure that server-side. */ /* * * if (minPoolSize != null) xmlWriter.println("<min-pool-size>" + minPoolSize + "</min-pool-size>"); * * if (maxPoolSize != null) xmlWriter.println("<max-pool-size>" + maxPoolSize + "</max-pool-size>"); * */ /* Demonstrates iterating over a map of user entered keys and values. */ /* * SimpleValue connPropertiesValue = dsRootValue.get("connection-properties"); Map<String, SimpleValue> * connPropertiesMap = connPropertiesValue.getMap(); * * Set<String> propNames = connPropertiesMap.keySet(); for (String name : propNames) { SimpleValue value = * connPropertiesMap.get(name); xmlWriter.println("<connection-property name=\"" + name + "\">" + value + * "</connection-property>"); } * * xmlWriter.println("</no-tx-datasource>"); } else if ((dsRootValue = valueSet.getCompositeValue("local-tx-ds")) != * null) { // Handling for local TX databases } else if ((dsRootValue = valueSet.getCompositeValue("xa-tx-ds")) != * null) { // Handling for XA databases } * * xmlWriter.println("</datasources>");}*/ }