use of io.crnk.core.engine.information.resource.ResourceFieldType in project crnk-framework by crnk-project.
the class ResourceInformationProviderBase method buildResourceField.
protected void buildResourceField(BeanInformation beanDesc, BeanAttributeInformation attributeDesc, InformationBuilder.Field fieldBuilder) {
fieldBuilder.underlyingName(attributeDesc.getName());
fieldBuilder.jsonName(getJsonName(attributeDesc));
ResourceFieldType fieldType = getFieldType(attributeDesc);
fieldBuilder.fieldType(fieldType);
fieldBuilder.access(getAccess(attributeDesc, fieldType));
fieldBuilder.serializeType(getSerializeType(attributeDesc, fieldType));
fieldBuilder.lookupIncludeBehavior(getLookupIncludeBehavior(attributeDesc));
fieldBuilder.relationshipRepositoryBehavior(getRelationshipRepositoryBehavior(attributeDesc));
Type genericType;
if (useFieldType(attributeDesc)) {
fieldBuilder.type(attributeDesc.getField().getType());
genericType = attributeDesc.getField().getGenericType();
} else {
fieldBuilder.type(attributeDesc.getGetter().getReturnType());
genericType = attributeDesc.getGetter().getGenericReturnType();
}
fieldBuilder.genericType(genericType);
if (fieldType == ResourceFieldType.RELATIONSHIP) {
fieldBuilder.oppositeResourceType(getResourceType(genericType, context));
fieldBuilder.oppositeName(getOppositeName(attributeDesc));
Optional<JsonApiRelation> relationAnnotation = attributeDesc.getAnnotation(JsonApiRelation.class);
if (relationAnnotation.isPresent()) {
boolean multiValued = Collection.class.isAssignableFrom(attributeDesc.getImplementationClass());
String suffix = multiValued ? "Ids" : "Id";
String idFieldName;
if (relationAnnotation.get().idField().length() > 0) {
idFieldName = relationAnnotation.get().idField();
} else {
idFieldName = attributeDesc.getName() + suffix;
}
BeanAttributeInformation idAttribute = beanDesc.getAttribute(idFieldName);
if (idAttribute == null && multiValued && attributeDesc.getName().endsWith("s")) {
// also try to correlate by removing ending s
String idFieldNameTemp = attributeDesc.getName().substring(0, attributeDesc.getName().length() - 1) + suffix;
BeanAttributeInformation idAttributeTemp = beanDesc.getAttribute(idFieldNameTemp);
// make sure there are no custom get-named methods
if (idAttributeTemp != null && attributeDesc.getGetter() != null && idAttributeTemp.getGetter().getReturnType().equals(attributeDesc.getGetter().getReturnType())) {
idFieldName = idFieldNameTemp;
idAttribute = idAttributeTemp;
}
}
if (idAttribute != null) {
fieldBuilder.idName(idFieldName);
fieldBuilder.idType(idAttribute.getImplementationClass());
}
}
}
}
use of io.crnk.core.engine.information.resource.ResourceFieldType in project crnk-framework by crnk-project.
the class CustomResourceFieldTest method setupModule.
@Override
protected void setupModule(final JpaModule module, boolean server) {
super.setupModule(module, server);
if (server) {
module.setResourceInformationProvider(new JpaResourceInformationProvider(new NullPropertiesProvider()) {
@Override
protected List<ResourceField> getResourceFields(Class clazz) {
List<ResourceField> fields = super.getResourceFields(clazz);
if (clazz == CountryEntity.class) {
List<String> languages = Arrays.asList("en", "de");
for (final String language : languages) {
ResourceFieldType resourceFieldType = ResourceFieldType.ATTRIBUTE;
String name = language + "Text";
Class<?> type = String.class;
ResourceFieldAccess access = new ResourceFieldAccess(true, true, true, false, false);
ResourceFieldImpl field = new ResourceFieldImpl(name, name, resourceFieldType, type, type, null, null, SerializeType.LAZY, LookupIncludeBehavior.NONE, access, null, null, null, RelationshipRepositoryBehavior.DEFAULT);
field.setAccessor(new ResourceFieldAccessor() {
@Override
public String getValue(Object resource) {
CountryEntity country = (CountryEntity) resource;
List<CountryTranslationEntity> translations = country.getTranslations();
CountryTranslationEntity translation = getTranslation(translations, language);
return translation != null ? translation.getTxt() : null;
}
@Override
public void setValue(Object resource, Object fieldValue) {
CountryEntity country = (CountryEntity) resource;
List<CountryTranslationEntity> translations = country.getTranslations();
CountryTranslationEntity translation = getTranslation(translations, language);
if (translation == null) {
EntityManager em = module.getEntityManager();
LangEntity langEntity = em.find(LangEntity.class, language);
if (langEntity == null) {
throw new IllegalStateException("language not found: " + language);
}
translation = new CountryTranslationEntity();
CountryTranslationPK pk = new CountryTranslationPK();
pk.setCountry(country);
pk.setLang(langEntity);
translation.setCountryTranslationPk(pk);
translations.add(translation);
}
translation.setTxt((String) fieldValue);
}
private CountryTranslationEntity getTranslation(List<CountryTranslationEntity> translations, String language) {
for (CountryTranslationEntity translation : translations) {
CountryTranslationPK translationPk = translation.getCountryTranslationPk();
String langCd = translationPk.getLang().getLangCd();
if (langCd.equals(language)) {
return translation;
}
}
return null;
}
});
fields.add(field);
}
}
return fields;
}
});
}
}
Aggregations