@Override public boolean accept(Class<?> repositoryClass) { return RelationshipRepository.class.isAssignableFrom(repositoryClass) || RelationshipRepositoryV2.class.isAssignableFrom(repositoryClass) || ClassUtils.getAnnotation(repositoryClass, JsonApiRelationshipRepository.class).isPresent(); }
@Override public boolean accept(Class<?> repositoryClass) { boolean legacyRepo = ResourceRepository.class.isAssignableFrom(repositoryClass); boolean interfaceRepo = ResourceRepositoryV2.class.isAssignableFrom(repositoryClass); boolean anontationRepo = ClassUtils.getAnnotation(repositoryClass, JsonApiResourceRepository.class).isPresent(); return legacyRepo || interfaceRepo || anontationRepo; }
@Override public <A extends Annotation> List<Object> getInstancesByAnnotation(Class<A> annotationClass) { BeanManager beanManager = CDI.current().getBeanManager(); Set<Bean<?>> beans = beanManager.getBeans(Object.class); List<Object> list = new ArrayList<>(); for (Bean<?> bean : beans) { Class<?> beanClass = bean.getBeanClass(); Optional<A> annotation = ClassUtils.getAnnotation(beanClass, annotationClass); if (annotation.isPresent()) { CreationalContext<?> creationalContext = beanManager.createCreationalContext(bean); Object object = beanManager.getReference(bean, beanClass, creationalContext); list.add(object); } } return list; }
@Override public Class<?> getTargetAffiliation() { @SuppressWarnings("unchecked") final Optional<JsonApiRelationshipRepository> annotation = ClassUtils.getAnnotation( repositoryInstanceBuilder.getRepositoryClass(), JsonApiRelationshipRepository.class ); if (annotation.isPresent()) { return annotation.get().target(); } else { throw new IllegalArgumentException( String.format( "Class %s must be annotated with @JsonApiRelationshipRepository", repositoryInstanceBuilder.getClass().getName() ) ); } }
@SuppressWarnings({ "rawtypes", "unchecked" }) private void setupRelationship(List<ResponseRelationshipEntry> relationshipEntries, final RelationshipRepositoryInformation relationshipRepositoryInformation, final Object relRepository) { final Object decoratedRepository = decorateRepository(relRepository); RepositoryInstanceBuilder<Object> relationshipInstanceBuilder = new RepositoryInstanceBuilder<Object>(null, null) { @Override public Object buildRepository() { return decoratedRepository; } @Override public Class getRepositoryClass() { return relationshipRepositoryInformation.getRepositoryClass(); } }; if (ClassUtils.getAnnotation(relRepository.getClass(), JsonApiRelationshipRepository.class).isPresent()) { relationshipEntries.add(new AnnotatedRelationshipEntryBuilder(this, relationshipInstanceBuilder)); } else { ResponseRelationshipEntry relationshipEntry = new DirectResponseRelationshipEntry(relationshipInstanceBuilder) { @Override public Class<?> getTargetAffiliation() { return relationshipRepositoryInformation.getResourceInformation().getResourceClass(); } }; relationshipEntries.add(relationshipEntry); } }
@SuppressWarnings({ "rawtypes", "unchecked" }) private ResourceEntry setupResourceRepository(ResourceRepositoryInformation resourceRepositoryInformation, Object repository) { final Object decoratedRepository = decorateRepository(repository); RepositoryInstanceBuilder repositoryInstanceBuilder = new RepositoryInstanceBuilder(null, null) { @Override public Object buildRepository() { return decoratedRepository; } }; if (ClassUtils.getAnnotation(decoratedRepository.getClass(), JsonApiResourceRepository.class).isPresent()) { return new AnnotatedResourceEntry(this, repositoryInstanceBuilder); } else { return new DirectResponseResourceEntry(repositoryInstanceBuilder); } }
protected Class<?> getSourceResourceClass(Object repository, Class<?> repositoryClass) { Optional<JsonApiRelationshipRepository> annotation = ClassUtils.getAnnotation(repositoryClass, JsonApiRelationshipRepository.class); if (annotation.isPresent()) { return annotation.get().source(); } else if (RelationshipRepository.class.isAssignableFrom(repositoryClass)) { Class<?>[] typeArgs = TypeResolver.resolveRawArguments(RelationshipRepository.class, repositoryClass); return typeArgs[0]; } else if (repository != null) { RelationshipRepositoryV2<?, ?, ?, ?> querySpecRepo = (RelationshipRepositoryV2<?, ?, ?, ?>) repository; return querySpecRepo.getSourceResourceClass(); } else { Class<?>[] typeArgs = TypeResolver.resolveRawArguments(RelationshipRepositoryV2.class, repositoryClass); return typeArgs[0]; } }
protected Class<?> getTargetResourceClass(Object repository, Class<?> repositoryClass) { Optional<JsonApiRelationshipRepository> annotation = ClassUtils.getAnnotation(repositoryClass, JsonApiRelationshipRepository.class); if (annotation.isPresent()) { return annotation.get().target(); } else if (RelationshipRepository.class.isAssignableFrom(repositoryClass)) { Class<?>[] typeArgs = TypeResolver.resolveRawArguments(RelationshipRepository.class, repositoryClass); return typeArgs[2]; } else if (repository != null) { RelationshipRepositoryV2<?, ?, ?, ?> querySpecRepo = (RelationshipRepositoryV2<?, ?, ?, ?>) repository; return querySpecRepo.getTargetResourceClass(); } else { Class<?>[] typeArgs = TypeResolver.resolveRawArguments(RelationshipRepositoryV2.class, repositoryClass); return typeArgs[2]; } } }
protected Class<?> getResourceClass(Object repository, Class<?> repositoryClass) { Optional<JsonApiResourceRepository> annotation = ClassUtils.getAnnotation(repositoryClass, JsonApiResourceRepository.class); if (annotation.isPresent()) { return annotation.get().value(); } else if (repository instanceof ResourceRepository) { Class<?>[] typeArgs = TypeResolver.resolveRawArguments(ResourceRepository.class, repository.getClass()); return typeArgs[0]; } else if (repository != null) { ResourceRepositoryV2<?, ?> querySpecRepo = (ResourceRepositoryV2<?, ?>) repository; return querySpecRepo.getResourceClass(); } else { Class<?>[] typeArgs = TypeResolver.resolveRawArguments(ResourceRepositoryV2.class, repositoryClass); return typeArgs[0]; } } }
@SuppressWarnings({"unchecked", "rawtypes"}) public ResourceInformation build(Class<?> resourceClass) { List<AnnotatedResourceField> resourceFields = getResourceFields(resourceClass); String resourceType = getResourceType(resourceClass); Optional<JsonPropertyOrder> propertyOrder = ClassUtils.getAnnotation(resourceClass, JsonPropertyOrder.class); if (propertyOrder.isPresent()) { JsonPropertyOrder propertyOrderAnnotation = propertyOrder.get(); Collections.sort(resourceFields, new FieldOrderedComparator(propertyOrderAnnotation.value(), propertyOrderAnnotation.alphabetic())); } DefaultResourceInstanceBuilder<?> instanceBuilder = new DefaultResourceInstanceBuilder(resourceClass); Class<?> superclass = resourceClass.getSuperclass(); String superResourceType = superclass != Object.class && context.accept(superclass) ? context.getResourceType(superclass) : null; return new ResourceInformation(context.getTypeParser(), resourceClass, resourceType, superResourceType, instanceBuilder, (List) resourceFields); }
JsonApiResourceRepository annotation = ClassUtils.getAnnotation(repository.getClass(), JsonApiResourceRepository.class).get(); Class<?> resourceClass = annotation.value(); module.addRepository(resourceClass, repository); JsonApiRelationshipRepository annotation = ClassUtils.getAnnotation(repository.getClass(), JsonApiRelationshipRepository.class).get(); module.addRepository(annotation.source(), annotation.target(), repository);