/* * Copyright 2013 Guidewire Software, Inc. */ package gw.internal.xml.xsd.typeprovider; import gw.lang.reflect.*; import gw.lang.reflect.FeatureManager; import gw.lang.reflect.IAnnotationInfo; import gw.lang.reflect.IConstructorInfo; import gw.lang.reflect.IMethodInfo; import gw.lang.reflect.IPropertyInfo; import gw.lang.reflect.IRelativeTypeInfo; import gw.lang.reflect.IType; import gw.lang.reflect.TypeInfoBase; import gw.lang.reflect.TypeSystem; import gw.util.concurrent.LockingLazyVar; import java.util.Collections; import java.util.List; public abstract class XmlTypeData extends TypeInfoBase implements IXmlTypeData, IRelativeTypeInfo { private final LockingLazyVar<IType> TYPE = new LockingLazyVar<IType>() { @Override protected IType init() { return TypeSystem.getByFullName( getName() ); } }; private final LockingLazyVar<FeatureManager<String>> _fm = new LockingLazyVar<FeatureManager<String>>() { @Override protected FeatureManager<String> init() { FeatureManager<String> fm = new FeatureManager<String>( XmlTypeData.this, true, true ); if ( prefixSuperProperties() ) { fm.setSuperPropertyPrefix( "$" ); } IType supertypeToCopyPropertiesFrom = getSupertypeToCopyPropertiesFrom(); if ( supertypeToCopyPropertiesFrom != null ) { fm.setSupertypeToCopyPropertiesFrom( supertypeToCopyPropertiesFrom ); } return fm; } }; private int _lastSingleRefreshChecksum; @Override public final List<? extends IPropertyInfo> getProperties() { maybeClearTypeInfo(); return _fm.get().getProperties( Accessibility.PUBLIC ); } public abstract String getName(); @Override public final IPropertyInfo getProperty( CharSequence propName ) { maybeClearTypeInfo(); return _fm.get().getProperty( Accessibility.PUBLIC, propName ); } @Override public final MethodList getMethods() { maybeClearTypeInfo(); return _fm.get().getMethods( Accessibility.PUBLIC ); } @Override public final List<? extends IConstructorInfo> getConstructors() { maybeClearTypeInfo(); return _fm.get().getConstructors( Accessibility.PUBLIC ); } @Override public final List<IAnnotationInfo> getDeclaredAnnotations() { maybeClearTypeInfo(); return Collections.emptyList(); } @Override public final boolean hasAnnotation( IType type ) { // maybeClearTypeInfo(); return false; } @Override public final IType getOwnersType() { return TYPE.get(); } @Override public final IType getType() { return TYPE.get(); } @Override public List<Class<?>> getAdditionalInterfaces() { // maybeClearTypeInfo(); return Collections.emptyList(); } @Override public Accessibility getAccessibilityForType( IType whosaskin ) { return FeatureManager.getAccessibilityForClass(getOwnersType(), whosaskin); } @Override public List<? extends IPropertyInfo> getProperties( IType whosaskin ) { maybeClearTypeInfo(); return _fm.get().getProperties( getAccessibilityForType( whosaskin ) ); } @Override public IPropertyInfo getProperty( IType whosaskin, CharSequence propName ) { maybeClearTypeInfo(); return _fm.get().getProperty( getAccessibilityForType( whosaskin ), propName ); } @Override public MethodList getMethods(IType whosaskin) { maybeClearTypeInfo(); return _fm.get().getMethods( getAccessibilityForType( whosaskin ) ); } @Override public IMethodInfo getMethod( IType whosaskin, CharSequence methodName, IType... params ) { maybeClearTypeInfo(); return _fm.get().getMethod( getAccessibilityForType( whosaskin ), methodName, params ); } @Override public List<? extends IConstructorInfo> getConstructors( IType whosaskin ) { maybeClearTypeInfo(); return _fm.get().getConstructors( getAccessibilityForType( whosaskin ) ); } @Override public IConstructorInfo getConstructor( IType whosAskin, IType[] params ) { maybeClearTypeInfo(); return _fm.get().getConstructor( getAccessibilityForType( whosAskin ), params ); } @Override public List<? extends IType> getInterfaces() { return Collections.emptyList(); } @Override public IType getSupertypeToCopyPropertiesFrom() { return null; } @Override public String toString() { return getName(); } private void maybeClearTypeInfo() { int singleRefreshChecksum = TypeSystem.getSingleRefreshChecksum(); if ( _lastSingleRefreshChecksum != singleRefreshChecksum ) { _fm.clear(); _lastSingleRefreshChecksum = singleRefreshChecksum; } } }