/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.internal.gosu.properties;
import gw.fs.IFile;
import gw.lang.reflect.IPropertyInfo;
import gw.lang.reflect.IType;
import gw.lang.reflect.ITypeInfo;
import gw.lang.reflect.ITypeLoader;
import gw.lang.reflect.TypeBase;
import gw.lang.reflect.gs.IPropertiesType;
import gw.util.GosuClassUtil;
import gw.util.concurrent.LockingLazyVar;
import java.util.Collections;
/**
* Type based on a {@link PropertyNode}
*/
@SuppressWarnings("serial")
public class PropertiesType extends TypeBase implements IPropertiesType {
private final PropertiesTypeLoader _typeLoader;
private final PropertyNode _propertyNode;
private IFile _file;
private final LockingLazyVar<PropertiesTypeInfo> _typeInfo = new LockingLazyVar<PropertiesTypeInfo>() {
@Override
protected PropertiesTypeInfo init() {
return new PropertiesTypeInfo(PropertiesType.this);
}
};
public PropertiesType(PropertiesTypeLoader typeLoader, PropertyNode propertyNode, IFile file) {
_typeLoader = typeLoader;
_propertyNode = propertyNode;
_file = file;
}
@Override
public IType[] getInterfaces() {
return EMPTY_TYPE_ARRAY;
}
@Override
public String getName() {
return _propertyNode.getTypeName();
}
@Override
public String getNamespace() {
return GosuClassUtil.getPackage( getName() );
}
@Override
public String getRelativeName() {
return GosuClassUtil.getShortClassName( getName() );
}
@Override
public IType getSupertype() {
return null;
}
@Override
public ITypeInfo getTypeInfo() {
return _typeInfo.get();
}
@Override
public ITypeLoader getTypeLoader() {
return _typeLoader;
}
@Override
public boolean isMutable() {
return false;
}
PropertyNode getPropertyNode() {
return _propertyNode;
}
@Override
public String getPropertiesFileKey( IPropertyInfo pi )
{
PropertiesPropertyInfo ppi = (PropertiesPropertyInfo)pi;
return ppi.getPropertyEntryName();
}
@Override
public IFile[] getSourceFiles() {
if( _file == null ) {
// _file may be null e.g., for SystemProperties
return IFile.EMPTY_ARRAY;
}
return new IFile[] {_file};
}
}