/*
* 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 java.util.HashMap;
import org.csstudio.dal.DynamicValueProperty;
import org.csstudio.dal.context.AbstractApplicationContext;
import org.csstudio.dal.context.PropertyFamily;
import org.csstudio.dal.group.GroupDataAccess;
import org.csstudio.dal.group.PropertyCollectionMap;
import org.csstudio.dal.group.PropertyGroupConstrain;
import org.csstudio.dal.proxy.AbstractPlug;
import org.csstudio.dal.proxy.DirectoryProxy;
import org.csstudio.dal.proxy.PropertyProxy;
import org.csstudio.dal.proxy.Proxy;
import org.csstudio.dal.spi.PropertyFactory;
/**
* The default implementation of the {@link PropertyFamily}. This class is
* based on the {@link PropertyCollectionMap}, which means that all properties
* are stored within a {@link HashMap}. Note that HashMap is not synchronized
* and therefore if multiple threads add or remove properties to this family
* the calls should be synchronized externally.
*
* @author ikriznar
*
*/
public class PropertyFamilyImpl
extends PropertyCollectionMap<DynamicValueProperty<?>> implements PropertyFamily
{
PropertyFactory pf;
static final Class<?> c = DynamicValueProperty.class;
/**
* Constructs a new PropertyFamilyImpl that belongs to the given {@link PropertyFactory}.
*/
@SuppressWarnings("unchecked")
public PropertyFamilyImpl(PropertyFactory pf)
{
super((Class<DynamicValueProperty<?>>) c);
this.pf = pf;
}
/* (non-Javadoc)
* @see org.csstudio.dal.context.PropertyFamily#destroyAll()
*/
@Override
public void destroyAll()
{
DynamicValueProperty<?>[] props = new DynamicValueProperty[size()];
props = toArray((DynamicValueProperty<?>[])props);
clear();
AbstractPlug plug = (AbstractPlug)pf.getPlug();
for (DynamicValueProperty<?> p : props) {
PropertyProxy<?,?> proxy = ((DataAccessImpl<?>)p).getProxy();
if (!(proxy instanceof DirectoryProxy)) {
DirectoryProxy<?> dp = ((SimplePropertyImpl<?>)p).getDirectoryProxy();
if (dp != null) {
plug.releaseProxy(dp);
dp.destroy();
}
}
if (p instanceof DynamicValuePropertyImpl<?>) {
((DynamicValuePropertyImpl<?>) p).releaseProxy(true);
}
plug.releaseProxy(proxy);
}
}
/* (non-Javadoc)
* @see org.csstudio.dal.context.PropertyFamily#destroy(org.csstudio.dal.DynamicValueProperty)
*/
@Override
public void destroy(DynamicValueProperty<?> prop)
{
if (prop==null || !contains(prop)) return;
this.remove((DynamicValueProperty<?>) prop);
AbstractPlug plug = (AbstractPlug)pf.getPlug();
Proxy<?>[] proxy = ((DataAccessImpl<?>)prop).releaseProxy(true);
if (proxy!=null && proxy[0]!=null) {
plug.releaseProxy(proxy[0]);
}
if (proxy!=null && proxy[1]!=null && proxy[0]!=proxy[1]) {
plug.releaseProxy(proxy[1]);
}
}
/* (non-Javadoc)
* @see org.csstudio.dal.context.PropertyFamily#getApplicationContext()
*/
@Override
public AbstractApplicationContext getApplicationContext()
{
return pf.getApplicationContext();
}
/* (non-Javadoc)
* @see org.csstudio.dal.group.GroupDataAccessProvider#getGroupDataAccess(java.lang.Class, java.lang.Class)
*/
@Override
public <T, P extends DynamicValueProperty<?>> GroupDataAccess<T, P> getGroupDataAccess(
Class<T> dataType, Class<P> propertyType)
{
// TODO later
throw new UnsupportedOperationException();
}
/* (non-Javadoc)
* @see org.csstudio.dal.group.GroupDataAccessProvider#getGroupDataAccess(java.lang.Class, java.lang.Class, org.csstudio.dal.group.PropertyGroupConstrain)
*/
@Override
public <T, P extends DynamicValueProperty<T>> GroupDataAccess<T, P> getGroupDataAccess(
Class<T> dataType, Class<P> propertyType,
PropertyGroupConstrain constrain)
{
// TODO later
throw new UnsupportedOperationException();
}
/* (non-Javadoc)
* @see org.csstudio.dal.group.PropertyCollectionMap#add(T)
*/
@Override
public void add(DynamicValueProperty<?> property)
{
super.add(property);
}
/**
* Returns true if context contains property.
*
* @param property the property to check
*
* @see org.csstudio.dal.context.PropertyContext#containsProperty(java.lang.Object)
*/
@Override
public boolean containsProperty(Object property) {
return contains(property);
}
/**
* Returns true if context contains <b>ANY</b> property with provided name.
* <p>
* <b>Note!</b> there could be multiple property instances with same name in family.
* </p>
*
* @param name the property name to check for
*
* @see org.csstudio.dal.context.PropertyContext#containsProperty(java.lang.String)
*/
@Override
public boolean containsProperty(String name) {
return contains(name);
}
/**
* Returns first property it finds with provided name.
* There is no specific order in which multiple properties are held in the family.
*
* <p>
* <b>Note!</b> there could be multiple property instances with same name in family.
* </p>
*
* <p>
* This method calls <code>getFirst(String)</code>.
* </p>
*
* @param name the property name to check for
*
* @see org.csstudio.dal.context.PropertyContext#getProperty(java.lang.String)
* @see PropertyCollectionMap#getFirst(String);
*/
@Override
public DynamicValueProperty<?> getProperty(String name) {
return getFirst(name);
}
/**
* Returns plug type string, which is distinguishing for plug which
* creates proxies for particular communication layer.<p>For
* example plug that connects to EPICS device my return string "EPICS".</p>
*
* @return plug destingushing type name
*/
@Override
public String getPlugType() {
return pf.getPlugType();
}
}
/* __oOo__ */