@Test
 public void shouldCreateContainerResponseFilterWithBindingFromType() throws CoreException {
   // pre-conditions
   final IType nameBindingType =
       metamodelMonitor.resolveType(
           "org.jboss.tools.ws.jaxrs.sample.services.interceptors.CustomInterceptorBinding");
   JaxrsElementFactory.createElements(
       nameBindingType,
       JdtUtils.parse(nameBindingType, new NullProgressMonitor()),
       metamodel,
       new NullProgressMonitor());
   final IType providerType =
       metamodelMonitor.resolveType(
           "org.jboss.tools.ws.jaxrs.sample.services.interceptors.CustomResponseFilterWithBinding");
   // operation
   final List<IJaxrsElement> elements =
       JaxrsElementFactory.createElements(
           providerType,
           JdtUtils.parse(providerType, new NullProgressMonitor()),
           metamodel,
           new NullProgressMonitor());
   // verifications
   assertThat(elements.size(), equalTo(1));
   final JaxrsProvider provider = (JaxrsProvider) (elements.iterator().next());
   assertThat(provider.getAnnotations().size(), equalTo(2));
   assertThat(provider.getElementKind(), equalTo(EnumElementKind.CONTAINER_RESPONSE_FILTER));
   assertNull(provider.getProvidedType(EnumElementKind.CONTAINER_RESPONSE_FILTER));
   assertThat(provider.getNameBindingAnnotations().size(), equalTo(1));
   assertThat(
       provider.getNameBindingAnnotations().keySet().iterator().next(),
       equalTo("org.jboss.tools.ws.jaxrs.sample.services.interceptors.CustomInterceptorBinding"));
 }
 @Override
 protected IStatus superClassChanged() {
   final IStatus status = super.superClassChanged();
   // if there's already an error, let's go with it
   if (status.getSeverity() == IStatus.ERROR) {
     return status;
   }
   if (getJavaProject() != null && getSuperClass() != null && !getSuperClass().isEmpty()) {
     // check if the selected superclass is a subclass of
     // 'javax.ws.rs.core.Application'
     try {
       final IType selectedSuperClass = getJavaProject().findType(getSuperClass());
       final List<IType> selectedSuperClassHierarchy = JdtUtils.findSupertypes(selectedSuperClass);
       if (selectedSuperClassHierarchy != null) {
         for (IType type : selectedSuperClassHierarchy) {
           if (type.getFullyQualifiedName().equals(JaxrsClassnames.APPLICATION)) {
             return status;
           }
         }
         // no match for 'javax.ws.rs.core.Application', in the
         // hierarchy, let's raise an error
         return new Status(
             IStatus.ERROR,
             JBossJaxrsUIPlugin.PLUGIN_ID,
             JaxrsApplicationCreationMessages
                 .JaxrsApplicationCreationWizardPage_IllegalTypeHierarchy);
       }
     } catch (CoreException e) {
       Logger.error("Failed to retrieve type hierarchy for '" + getSuperClass() + "'", e);
     }
   }
   // return the status from the parent class
   return status;
 }
 @Test
 public void shouldCreateParameterAggregatorFromTypeWithAnnotatedField() throws CoreException {
   // pre-conditions
   metamodelMonitor.createCompilationUnit(
       "ParameterAggregator.txt",
       "org.jboss.tools.ws.jaxrs.sample.services",
       "ParameterAggregator.java");
   final IType parameterAggregatorType =
       metamodelMonitor.resolveType(
           "org.jboss.tools.ws.jaxrs.sample.services.ParameterAggregator");
   assertThat(parameterAggregatorType, notNullValue());
   replaceAllOccurrencesOfCode(
       parameterAggregatorType, "// PLACEHOLDER", "@PathParam(\"id2\") public String id2;", false);
   // operation
   final List<IJaxrsElement> elements =
       JaxrsElementFactory.createElements(
           parameterAggregatorType,
           JdtUtils.parse(parameterAggregatorType, new NullProgressMonitor()),
           metamodel,
           new NullProgressMonitor());
   // verification: parameter aggregator with child method created
   assertThat(elements.size(), equalTo(2));
   assertThat(
       elements.iterator().next().getElementKind(), equalTo(EnumElementKind.PARAMETER_AGGREGATOR));
   assertThat(
       elements.get(1).getElementKind(), equalTo(EnumElementKind.PARAMETER_AGGREGATOR_FIELD));
 }
 @Test
 public void shouldCreateResourceMethodWithBeanParamAnnotatedParameter()
     throws JavaModelException, CoreException {
   // pre-conditions
   final IType carType =
       metamodelMonitor.resolveType("org.jboss.tools.ws.jaxrs.sample.services.CarResource");
   replaceAllOccurrencesOfCode(
       carType,
       "update(final CarParameterAggregator car)",
       "update(@BeanParam final CarParameterAggregator car)",
       false);
   assertThat(carType, notNullValue());
   final IMethod carMethod = JavaElementsUtils.getMethod(carType, "update");
   assertThat(carMethod, notNullValue());
   // operation
   final List<IJaxrsElement> elements =
       JaxrsElementFactory.createElements(
           carType,
           JdtUtils.parse(carType, new NullProgressMonitor()),
           metamodel,
           new NullProgressMonitor());
   // verifications
   assertThat(elements.size(), equalTo(3));
   final JaxrsResource carResource = metamodel.findResource(carType);
   final JaxrsResourceMethod resourceMethod =
       carResource.getMethods().get(carMethod.getHandleIdentifier());
   assertThat(resourceMethod.getJavaMethodParameters().size(), equalTo(1));
   assertThat(
       resourceMethod
           .getJavaMethodParameters()
           .iterator()
           .next()
           .getAnnotation(JaxrsClassnames.BEAN_PARAM),
       notNullValue());
 }
 @Test
 public void shouldCreateParamConverterProviderFromType() throws CoreException {
   // pre-conditions
   final IType providerType =
       metamodelMonitor.resolveType(
           "org.jboss.tools.ws.jaxrs.sample.services.CarParamConverterProvider");
   // operation
   final List<IJaxrsElement> elements =
       JaxrsElementFactory.createElements(
           providerType,
           JdtUtils.parse(providerType, new NullProgressMonitor()),
           metamodel,
           new NullProgressMonitor());
   // verifications
   assertThat(elements.size(), equalTo(1));
   final JaxrsParamConverterProvider paramConverterProvider =
       (JaxrsParamConverterProvider) (elements.iterator().next());
   assertThat(paramConverterProvider.getAnnotations().size(), equalTo(1));
   assertThat(
       paramConverterProvider.getElementKind(), equalTo(EnumElementKind.PARAM_CONVERTER_PROVIDER));
   assertThat(metamodel.findAllParamConverterProviders().size(), equalTo(1));
   assertThat(
       metamodel.findAllParamConverterProviders().iterator().next(),
       equalTo((IJaxrsParamConverterProvider) paramConverterProvider));
 }
 @Test
 public void shouldCreateWriterInterceptorFromType() throws CoreException {
   // pre-conditions
   final IType providerType =
       metamodelMonitor.resolveType(
           "org.jboss.tools.ws.jaxrs.sample.services.interceptors.CustomWriterInterceptor");
   // operation
   final List<IJaxrsElement> elements =
       JaxrsElementFactory.createElements(
           providerType,
           JdtUtils.parse(providerType, new NullProgressMonitor()),
           metamodel,
           new NullProgressMonitor());
   // verifications
   assertThat(elements.size(), equalTo(1));
   final JaxrsProvider provider = (JaxrsProvider) (elements.iterator().next());
   assertThat(provider.getAnnotations().size(), equalTo(1));
   assertThat(provider.getElementKind(), equalTo(EnumElementKind.ENTITY_WRITER_INTERCEPTOR));
   assertNull(provider.getProvidedType(EnumElementKind.ENTITY_WRITER_INTERCEPTOR));
 }
 @Test
 public void shouldCreateContainerRequestFilterWithPreMatchingAnnotationFromType()
     throws CoreException {
   // pre-conditions
   final IType providerType =
       metamodelMonitor.resolveType(
           "org.jboss.tools.ws.jaxrs.sample.services.interceptors.CustomRequestFilter");
   // operation
   final List<IJaxrsElement> elements =
       JaxrsElementFactory.createElements(
           providerType,
           JdtUtils.parse(providerType, new NullProgressMonitor()),
           metamodel,
           new NullProgressMonitor());
   // verifications
   assertThat(elements.size(), equalTo(1));
   final JaxrsProvider provider = (JaxrsProvider) (elements.iterator().next());
   assertThat(provider.getAnnotations().size(), equalTo(2));
   assertThat(provider.getElementKind(), equalTo(EnumElementKind.CONTAINER_REQUEST_FILTER));
   assertThat(provider.getAnnotation(JaxrsClassnames.PRE_MATCHING), notNullValue());
   assertNull(provider.getProvidedType(EnumElementKind.CONTAINER_REQUEST_FILTER));
 }
 @Test
 public void shouldCreateNameBindingAnnotationFromType() throws CoreException {
   // pre-conditions
   final IType nameBindingType =
       metamodelMonitor.resolveType(
           "org.jboss.tools.ws.jaxrs.sample.services.interceptors.CustomInterceptorBinding");
   // operation
   final List<IJaxrsElement> elements =
       JaxrsElementFactory.createElements(
           nameBindingType,
           JdtUtils.parse(nameBindingType, new NullProgressMonitor()),
           metamodel,
           new NullProgressMonitor());
   // verifications
   assertThat(elements.size(), equalTo(1));
   final JaxrsNameBinding nameBinding = (JaxrsNameBinding) (elements.iterator().next());
   assertThat(nameBinding.getAnnotations().size(), equalTo(3));
   assertThat(nameBinding.getElementKind(), equalTo(EnumElementKind.NAME_BINDING));
   assertThat(metamodel.findAllNameBindings().size(), equalTo(1));
   assertThat(
       metamodel.findAllNameBindings().iterator().next(),
       equalTo((IJaxrsNameBinding) nameBinding));
 }
 @Test
 public void shouldNotCreateParameterAggregatorFromTypeWithUnannotatedMethod()
     throws CoreException {
   // pre-conditions
   metamodelMonitor.createCompilationUnit(
       "ParameterAggregator.txt",
       "org.jboss.tools.ws.jaxrs.sample.services",
       "ParameterAggregator.java");
   final IType parameterAggregatorType =
       metamodelMonitor.resolveType(
           "org.jboss.tools.ws.jaxrs.sample.services.ParameterAggregator");
   assertThat(parameterAggregatorType, notNullValue());
   replaceAllOccurrencesOfCode(
       parameterAggregatorType, "// PLACEHOLDER", "public void setId2(String id2) {}", false);
   // operation
   final List<IJaxrsElement> elements =
       JaxrsElementFactory.createElements(
           parameterAggregatorType,
           JdtUtils.parse(parameterAggregatorType, new NullProgressMonitor()),
           metamodel,
           new NullProgressMonitor());
   // verification: parameter aggregator with child method created
   assertThat(elements.size(), equalTo(0));
 }