/*
* Copyright (c) 2006 Stiftung Deutsches Elektronen-Synchroton,
* Member of the Helmholtz Association, (DESY), HAMBURG, GERMANY.
*
* THIS SOFTWARE IS PROVIDED UNDER THIS LICENSE ON AN "../AS IS" BASIS.
* WITHOUT WARRANTY OF ANY KIND, EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
* TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR PARTICULAR PURPOSE AND
* NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
* FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
* THE USE OR OTHER DEALINGS IN THE SOFTWARE. SHOULD THE SOFTWARE PROVE DEFECTIVE
* IN ANY RESPECT, THE USER ASSUMES THE COST OF ANY NECESSARY SERVICING, REPAIR OR
* CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE.
* NO USE OF ANY SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER.
* DESY HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS,
* OR MODIFICATIONS.
* THE FULL LICENSE SPECIFYING FOR THE SOFTWARE THE REDISTRIBUTION, MODIFICATION,
* USAGE AND OTHER RIGHTS AND OBLIGATIONS IS INCLUDED WITH THE DISTRIBUTION OF THIS
* PROJECT IN THE FILE LICENSE.HTML. IF THE LICENSE IS NOT INCLUDED YOU MAY FIND A COPY
* AT HTTP://WWW.DESY.DE/LEGAL/LICENSE.HTM
*/
package org.csstudio.dal.impl;
import org.apache.log4j.Logger;
import org.csstudio.dal.CharacteristicInfo;
import org.csstudio.dal.DataExchangeException;
import org.csstudio.dal.DoubleProperty;
import org.csstudio.dal.DynamicValueProperty;
import org.csstudio.dal.PatternProperty;
import org.csstudio.dal.SimpleProperty;
import org.csstudio.dal.proxy.DirectoryProxy;
import org.csstudio.dal.simple.impl.DataUtil;
/**
* Convenience utilities for plug implementators.
*
* @author Igor Kriznar (igor.kriznarATcosylab.com)
*/
public class PropertyUtilities
{
private PropertyUtilities()
{
super();
}
/**
* Returns class, which implements requested
*
* @param interfaceClass the interface who's implementation is requested
*
* @return class implementing requested interface
*
* @throws NullPointerException is thrown if interfaceClass is <code>null</code>
* @throws IllegalArgumentException is thrown if interfaceClass is not an interface
*/
public static Class<? extends SimpleProperty<?>> getImplementationClass(
Class<?extends SimpleProperty<?>> interfaceClass)
{
if (interfaceClass == null) {
throw new NullPointerException("interfaceClass");
}
if (!interfaceClass.isInterface()) {
throw new IllegalArgumentException("Class '"
+ interfaceClass.getName() + "' does not represent interface.");
}
// TODO: lines below should be unnecesary
if (interfaceClass == PatternProperty.class) {
return PatternPropertyImpl.class;
}
// default implementation
if (interfaceClass == DynamicValueProperty.class
|| interfaceClass == SimpleProperty.class) {
return DoublePropertyImpl.class;
}
// first we make wild guess from class name only
if (DynamicValueProperty.class.isAssignableFrom(interfaceClass)) {
String iname = interfaceClass.getName();
int i = iname.lastIndexOf('.');
String cname = iname.substring(0, i) + ".impl" + iname.substring(i)
+ "Impl";
try {
Class c = Class.forName(cname);
return c;
} catch (Throwable e) {
Logger.getLogger(PropertyUtilities.class).debug("Heuristic lookup failed.", e);
}
}
String iname = interfaceClass.getName();
int i = iname.lastIndexOf('.');
int j = iname.lastIndexOf("SimpleProperty");
if (j > 0) {
String cname = iname.substring(0, i) + ".impl"
+ iname.substring(i, j) + "PropertyImpl";
try {
Class c = Class.forName(cname);
return c;
} catch (Throwable e) {
Logger.getLogger(PropertyUtilities.class).debug("Heuristic lookup failed.", e);
}
}
if (DoubleProperty.class.isAssignableFrom(interfaceClass)) {
return DoublePropertyImpl.class;
}
throw new IllegalArgumentException("Class '" + interfaceClass.getName()
+ "' does not have declared implementation class.");
}
/**
* As conveinece method, meant to fix common characteristic aliases.
* @param proxy
* @param characteristicName
* @param value
* @return
* @throws DataExchangeException
*/
public static final Object verifyCharacteristic(DirectoryProxy proxy, String characteristicName, Object value) throws DataExchangeException {
if (value==null && characteristicName!=null) {
if (characteristicName.equals(CharacteristicInfo.C_DISPLAY_NAME.getName())) {
return proxy.getUniqueName();
}
if (characteristicName.equals(CharacteristicInfo.C_ALARM_MAX.getName())) {
return proxy.getCharacteristic(CharacteristicInfo.C_MAXIMUM.getName());
}
if (characteristicName.equals(CharacteristicInfo.C_ALARM_MIN.getName())) {
return proxy.getCharacteristic(CharacteristicInfo.C_MINIMUM.getName());
}
if (characteristicName.equals(CharacteristicInfo.C_WARNING_MAX.getName())) {
return proxy.getCharacteristic(CharacteristicInfo.C_MAXIMUM.getName());
}
if (characteristicName.equals(CharacteristicInfo.C_WARNING_MIN.getName())) {
return proxy.getCharacteristic(CharacteristicInfo.C_MINIMUM.getName());
}
if (characteristicName.equals(CharacteristicInfo.C_META_DATA.getName())) {
return DataUtil.createMetaData(proxy);
}
}
return value;
}
}
/* __oOo__ */