Author: xcoulon
Date: 2012-10-05 03:03:26 -0400 (Fri, 05 Oct 2012)
New Revision: 44332
Modified:
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/builder/JavaElementChangedProcessor.java
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/builder/JaxrsElementDelta.java
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/builder/JaxrsMetamodelChangedProcessor.java
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/builder/ResourceChangedProcessor.java
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/domain/JaxrsBuiltinHttpMethod.java
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/domain/JaxrsHttpMethod.java
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/domain/JaxrsJavaApplication.java
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/domain/JaxrsJavaElement.java
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/domain/JaxrsMetamodel.java
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/AbstractJaxrsElementValidatorDelegate.java
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsJavaApplicationValidatorDelegate.java
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsMetamodelValidator.java
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsMetamodelValidatorDelegate.java
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsResourceMethodValidatorDelegate.java
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsResourceValidatorDelegate.java
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsValidationMessages.java
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsValidationMessages.properties
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsWebxmlApplicationValidatorDelegate.java
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/metamodel/IJaxrsElement.java
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/preferences/JaxrsPreferences.java
trunk/ws/tests/org.jboss.tools.ws.jaxrs.core.test/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/builder/JavaElementChangedProcessorTestCase.java
trunk/ws/tests/org.jboss.tools.ws.jaxrs.core.test/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/builder/ResourceChangedProcessorTestCase.java
trunk/ws/tests/org.jboss.tools.ws.jaxrs.core.test/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsApplicationValidatorTestCase.java
trunk/ws/tests/org.jboss.tools.ws.jaxrs.core.test/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsResourceValidatorTestCase.java
trunk/ws/tests/org.jboss.tools.ws.jaxrs.core.test/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/MarkerUtils.java
Log:
Fixed - JBIDE-12790 - Broken tests after common validation rework
Fixed - JBIDE-12774 - Application validation error marker wont disappear
Fixed - JBIDE-12795 - JAX-RS application is not removed from metamodel as it should
Modified:
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/builder/JavaElementChangedProcessor.java
===================================================================
---
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/builder/JavaElementChangedProcessor.java 2012-10-05
07:01:03 UTC (rev 44331)
+++
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/builder/JavaElementChangedProcessor.java 2012-10-05
07:03:26 UTC (rev 44332)
@@ -132,14 +132,14 @@
//}
break;
case CHANGED:
- //if(element.exists()) { // needed to prevent exception for edge cases such as
'package-info.java' that holds some shadow 'A' type..
- switch (elementType) {
- case METHOD:
- return processChange((IMethod) element, ast, metamodel, progressMonitor);
- case ANNOTATION:
- return processChange((IAnnotation) element, ast, metamodel, progressMonitor);
- }
- //}
+ switch (elementType) {
+ case TYPE:
+ return processChange((IType) element, ast, metamodel, progressMonitor);
+ case METHOD:
+ return processChange((IMethod) element, ast, metamodel, progressMonitor);
+ case ANNOTATION:
+ return processChange((IAnnotation) element, ast, metamodel, progressMonitor);
+ }
break;
case REMOVED:
switch (elementType) {
@@ -338,6 +338,7 @@
}
/**
+ * Process changes on the JAX-RS element after the given annotation was changed
* @param javaAnnotation
* @param progressMonitor
* @throws CoreException
@@ -350,22 +351,8 @@
Annotation annotation = JdtUtils.resolveAnnotation(javaAnnotation, ast);
if (annotation != null) {
final JaxrsJavaElement<?> existingElement = (JaxrsJavaElement<?>)
metamodel.getElement(annotation);
- if (existingElement == null) {
- final JaxrsJavaElement<?> createdElement =
factory.createElement(javaAnnotation, ast, metamodel);
- if (createdElement != null) {
- metamodel.add(createdElement);
- changes.add(new JaxrsElementDelta(createdElement, ADDED));
- switch (createdElement.getElementCategory()) {
- case RESOURCE_FIELD:
- case RESOURCE_METHOD:
- JaxrsResource parentResource = ((JaxrsResourceElement<?>)
createdElement).getParentResource();
- if (metamodel.containsElement(parentResource)) {
- metamodel.add(parentResource);
- changes.add(new JaxrsElementDelta(parentResource, ADDED));
- }
- }
- }
- } else {
+ // there's no reason that an annotation *change* could trigger the creation of a
new JAX-RS element.
+ if (existingElement != null) {
final int flags = existingElement.addOrUpdateAnnotation(annotation);
if (flags > 0) {
changes.add(new JaxrsElementDelta(existingElement, CHANGED, flags));
@@ -375,6 +362,15 @@
return changes;
}
+ /**
+ * Process changes on the method, trying to find fine-grained changes in the
signatures/parameters
+ * @param javaMethod
+ * @param ast
+ * @param metamodel
+ * @param progressMonitor
+ * @return
+ * @throws CoreException
+ */
private List<JaxrsElementDelta> processChange(IMethod javaMethod, CompilationUnit
ast,
JaxrsMetamodel metamodel, IProgressMonitor progressMonitor) throws CoreException {
final List<JaxrsElementDelta> changes = new
ArrayList<JaxrsElementDelta>();
@@ -390,6 +386,33 @@
}
/**
+ * Process type change (eg: supertypes changes) and remove it if kind is UNDEFINED
+ * @param javaApplication
+ * @param ast
+ * @param metamodel
+ * @param progressMonitor
+ * @return
+ * @throws CoreException
+ */
+ private List<JaxrsElementDelta> processChange(IType javaType, CompilationUnit
ast,
+ JaxrsMetamodel metamodel, IProgressMonitor progressMonitor) throws CoreException {
+ final List<JaxrsElementDelta> changes = new
ArrayList<JaxrsElementDelta>();
+ final IJaxrsElement jaxrsElement = metamodel.getElement(javaType);
+ if (jaxrsElement != null && jaxrsElement.getElementKind() ==
EnumElementKind.APPLICATION_JAVA) {
+ final JaxrsJavaApplication javaApplication = (JaxrsJavaApplication) jaxrsElement;
+ final int flag = javaApplication.update(javaType);
+ if(javaApplication.getElementKind() == EnumElementKind.UNDEFINED) {
+ Logger.debug("Removing element {}", javaApplication);
+ metamodel.remove(javaApplication);
+ changes.add(new JaxrsElementDelta(jaxrsElement, REMOVED, flag));
+ }
+ else if (flag != F_NONE) {
+ changes.add(new JaxrsElementDelta(jaxrsElement, CHANGED, flag));
+ }
+ }
+ return changes;
+ }
+ /**
* @param element
* @param progressMonitor
* @return
Modified:
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/builder/JaxrsElementDelta.java
===================================================================
---
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/builder/JaxrsElementDelta.java 2012-10-05
07:01:03 UTC (rev 44331)
+++
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/builder/JaxrsElementDelta.java 2012-10-05
07:03:26 UTC (rev 44332)
@@ -18,6 +18,7 @@
import java.util.List;
import org.eclipse.jdt.core.IJavaElementDelta;
+import org.jboss.tools.ws.jaxrs.core.internal.metamodel.domain.JaxrsBaseElement;
import org.jboss.tools.ws.jaxrs.core.internal.utils.ConstantUtils;
import org.jboss.tools.ws.jaxrs.core.internal.utils.Logger;
import org.jboss.tools.ws.jaxrs.core.metamodel.EnumElementKind;
Modified:
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/builder/JaxrsMetamodelChangedProcessor.java
===================================================================
---
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/builder/JaxrsMetamodelChangedProcessor.java 2012-10-05
07:01:03 UTC (rev 44331)
+++
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/builder/JaxrsMetamodelChangedProcessor.java 2012-10-05
07:03:26 UTC (rev 44332)
@@ -323,7 +323,7 @@
}
}
// structural change : remove all endpoints associated with its methods
- // and creat new ones
+ // and create new ones
else {
for (JaxrsResourceMethod resourceMethod : resource.getMethods().values()) {
changes.addAll(processRemoval(resourceMethod));
Modified:
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/builder/ResourceChangedProcessor.java
===================================================================
---
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/builder/ResourceChangedProcessor.java 2012-10-05
07:01:03 UTC (rev 44331)
+++
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/builder/ResourceChangedProcessor.java 2012-10-05
07:03:26 UTC (rev 44332)
@@ -700,20 +700,20 @@
final JaxrsResource existingResource =
metamodel.getElement(eventResource.getJavaElement(),
JaxrsResource.class);
// compare at the fields level
- results.addAll(mergeResourceFields(existingResource, eventResource, metamodel));
+ results.addAll(updateResourceFields(existingResource, eventResource, metamodel));
// and compare at the methods level
- results.addAll(mergeResourceMethods(existingResource, eventResource, metamodel));
+ results.addAll(updateResourceMethods(existingResource, eventResource, metamodel));
// finally, compare at the annotations level
- results.addAll(mergeResourceAnnotations(existingResource, eventResource));
+ results.addAll(updateResourceAnnotations(existingResource, eventResource));
break;
}
return results;
}
- private final List<JaxrsElementDelta> mergeResourceAnnotations(final JaxrsResource
existingResource,
+ private final List<JaxrsElementDelta> updateResourceAnnotations(final
JaxrsResource existingResource,
final JaxrsResource matchingResource) {
final List<JaxrsElementDelta> changes = new
ArrayList<JaxrsElementDelta>();
- final int flags =
existingResource.mergeAnnotations(matchingResource.getAnnotations());
+ final int flags =
existingResource.updateAnnotations(matchingResource.getAnnotations());
if (flags > 0) {
changes.add(new JaxrsElementDelta(existingResource, CHANGED, flags));
}
@@ -728,7 +728,7 @@
* @param otherResource
* @return the flags indicating the kind of changes that occurred during the update.
*/
- private List<JaxrsElementDelta> mergeResourceFields(final JaxrsResource
existingResource,
+ private List<JaxrsElementDelta> updateResourceFields(final JaxrsResource
existingResource,
final JaxrsResource matchingResource, final JaxrsMetamodel metamodel) {
final List<JaxrsElementDelta> changes = new
ArrayList<JaxrsElementDelta>();
final Map<String, JaxrsResourceField> addedFields =
CollectionUtils.difference(matchingResource.getFields(),
@@ -747,7 +747,7 @@
for (Entry<String, JaxrsResourceField> entry : changedFields.entrySet()) {
final JaxrsResourceField existingField = entry.getValue();
final JaxrsResourceField matchingField =
matchingResource.getFields().get(entry.getKey());
- int flags = existingField.mergeAnnotations(matchingField.getAnnotations());
+ int flags = existingField.updateAnnotations(matchingField.getAnnotations());
if ((flags & F_ELEMENT_KIND) > 0 && existingField.getElementKind() ==
EnumElementKind.UNDEFINED) {
metamodel.remove(existingField);
changes.add(new JaxrsElementDelta(existingField, REMOVED));
@@ -765,7 +765,7 @@
return changes;
}
- private List<JaxrsElementDelta> mergeResourceMethods(final JaxrsResource
existingResource,
+ private List<JaxrsElementDelta> updateResourceMethods(final JaxrsResource
existingResource,
final JaxrsResource matchingResource, final JaxrsMetamodel metamodel) throws
JavaModelException {
final List<JaxrsElementDelta> changes = new
ArrayList<JaxrsElementDelta>();
final Map<String, JaxrsResourceMethod> addedMethods =
CollectionUtils.difference(matchingResource.getMethods(),
@@ -784,7 +784,7 @@
for (Entry<String, JaxrsResourceMethod> entry : changedMethods.entrySet()) {
final JaxrsResourceMethod existingMethod = entry.getValue();
final JaxrsResourceMethod matchingMethod =
matchingResource.getMethods().get(entry.getKey());
- int flags = existingMethod.mergeAnnotations(matchingMethod.getAnnotations());
+ int flags = existingMethod.updateAnnotations(matchingMethod.getAnnotations());
final CompilationUnit matchingResourceAST =
CompilationUnitsRepository.getInstance().getAST(matchingResource.getResource());
final JavaMethodSignature matchingResourceMethodSignature =
JdtUtils.resolveMethodSignature(matchingMethod.getJavaElement(), matchingResourceAST);
if(matchingResourceMethodSignature != null) {
@@ -805,4 +805,5 @@
}
return changes;
}
+
}
Modified:
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/domain/JaxrsBuiltinHttpMethod.java
===================================================================
---
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/domain/JaxrsBuiltinHttpMethod.java 2012-10-05
07:01:03 UTC (rev 44331)
+++
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/domain/JaxrsBuiltinHttpMethod.java 2012-10-05
07:03:26 UTC (rev 44332)
@@ -98,6 +98,15 @@
return true;
}
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ return "HttpMethod (built-in)[@" + getJavaClassName() + ":" +
httpVerb + "]";
+ }
}
Modified:
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/domain/JaxrsHttpMethod.java
===================================================================
---
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/domain/JaxrsHttpMethod.java 2012-10-05
07:01:03 UTC (rev 44331)
+++
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/domain/JaxrsHttpMethod.java 2012-10-05
07:03:26 UTC (rev 44332)
@@ -205,7 +205,7 @@
* @see java.lang.Object#toString()
*/
@Override
- public final String toString() {
+ public String toString() {
return "HttpMethod [@" + getJavaClassName() + ":" +
getHttpMethodAnnotation() + "]";
}
@@ -246,7 +246,7 @@
flags += F_HTTP_METHOD_VALUE;
}
return flags;*/
- return mergeAnnotations(httpMethod.getAnnotations());
+ return updateAnnotations(httpMethod.getAnnotations());
}
}
Modified:
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/domain/JaxrsJavaApplication.java
===================================================================
---
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/domain/JaxrsJavaApplication.java 2012-10-05
07:01:03 UTC (rev 44331)
+++
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/domain/JaxrsJavaApplication.java 2012-10-05
07:03:26 UTC (rev 44332)
@@ -13,9 +13,13 @@
import static
org.jboss.tools.ws.jaxrs.core.internal.metamodel.builder.JaxrsElementDelta.*;
import static org.jboss.tools.ws.jaxrs.core.jdt.EnumJaxrsClassname.APPLICATION_PATH;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jdt.core.IType;
import org.jboss.tools.ws.jaxrs.core.internal.utils.Logger;
import org.jboss.tools.ws.jaxrs.core.jdt.Annotation;
+import org.jboss.tools.ws.jaxrs.core.jdt.EnumJaxrsClassname;
+import org.jboss.tools.ws.jaxrs.core.jdt.JdtUtils;
import org.jboss.tools.ws.jaxrs.core.metamodel.EnumElementCategory;
import org.jboss.tools.ws.jaxrs.core.metamodel.EnumElementKind;
import org.jboss.tools.ws.jaxrs.core.metamodel.IJaxrsApplication;
@@ -53,7 +57,10 @@
@Override
public EnumElementKind getElementKind() {
- return EnumElementKind.APPLICATION_JAVA;
+ if(isApplicationSubclass || getApplicationPathAnnotation() != null) {
+ return EnumElementKind.APPLICATION_JAVA;
+ }
+ return EnumElementKind.UNDEFINED;
}
public boolean isJaxrsCoreApplicationSubclass() {
@@ -96,12 +103,20 @@
if(applicationPathOverride != null) {
return applicationPathOverride;
}
- final Annotation applicationPathAnnotation =
getAnnotation(APPLICATION_PATH.qualifiedName);
+ final Annotation applicationPathAnnotation = getApplicationPathAnnotation();
if (applicationPathAnnotation != null) {
return applicationPathAnnotation.getValue("value");
}
return null;
}
+
+ /**
+ * @return the
+ * <code>javax.ws.rs.ApplicationPath<code> annotation set on the
underlying javatype, or null if none exists.
+ */
+ public Annotation getApplicationPathAnnotation() {
+ return getAnnotation(APPLICATION_PATH.qualifiedName);
+ }
public boolean isOverriden() {
return (metamodel.getWebxmlApplication(this.getJavaClassName()) != null);
@@ -133,15 +148,37 @@
}
if(this.isJaxrsCoreApplicationSubclass() !=
application.isJaxrsCoreApplicationSubclass()) {
+ this.isApplicationSubclass = application.isJaxrsCoreApplicationSubclass();
flags += F_APPLICATION_HIERARCHY;
}
return flags;
}
-
+
+ /**
+ * Update this application from the given underlying java type. This update() method
focused on supertype changes,
+ * as annotation updates are taken into account by the {@link
JaxrsJavaElement#updateAnnotations(java.util.Map)}
+ * method.
+ *
+ * @param javaType
+ * @return flags indicating the nature of the changes
+ * @throws CoreException
+ */
+ public int update(IType javaType) throws CoreException {
+ int flags = 0;
+ final IType applicationSupertype =
JdtUtils.resolveType(EnumJaxrsClassname.APPLICATION.qualifiedName,
javaType.getJavaProject(), new NullProgressMonitor());
+ final boolean isApplicationSubclass = JdtUtils.isTypeOrSuperType(applicationSupertype,
javaType);
+ if(this.isJaxrsCoreApplicationSubclass() != isApplicationSubclass) {
+ this.isApplicationSubclass = isApplicationSubclass;
+ flags += F_APPLICATION_HIERARCHY;
+ }
+ return flags;
+ }
+
@Override
public String toString() {
- return ("JavaApplication '" + getJavaElement().getElementName() +
"': " + getApplicationPath());
+ return ("JavaApplication '" + getJavaElement().getElementName() +
"': path=" + getApplicationPath());
}
+
}
Modified:
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/domain/JaxrsJavaElement.java
===================================================================
---
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/domain/JaxrsJavaElement.java 2012-10-05
07:01:03 UTC (rev 44331)
+++
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/domain/JaxrsJavaElement.java 2012-10-05
07:03:26 UTC (rev 44332)
@@ -138,7 +138,7 @@
return F_NONE;
}
- public int mergeAnnotations(Map<String, Annotation> otherAnnotations) {
+ public int updateAnnotations(Map<String, Annotation> otherAnnotations) {
int flags = 0;
// keep values in the 'otherAnnotations' map
final Map<String, Annotation> addedAnnotations =
CollectionUtils.difference(otherAnnotations, this.annotations);
Modified:
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/domain/JaxrsMetamodel.java
===================================================================
---
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/domain/JaxrsMetamodel.java 2012-10-05
07:01:03 UTC (rev 44331)
+++
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/domain/JaxrsMetamodel.java 2012-10-05
07:03:26 UTC (rev 44332)
@@ -133,7 +133,7 @@
public IResource getResource() {
return getProject();
}
-
+
@Override
public String getName() {
return "JAX-RS Metamodel for project " + getProject().getName();
@@ -732,21 +732,7 @@
if (this == obj) {
return true;
}
- if (obj == null) {
- return false;
- }
- if (getClass() != obj.getClass()) {
- return false;
- }
- JaxrsMetamodel other = (JaxrsMetamodel) obj;
- if (javaProject == null && other.javaProject != null) {
- return false;
- } else if (javaProject != null && other.javaProject == null) {
- return false;
- } else if (javaProject != null && other.javaProject != null &&
!javaProject.getHandleIdentifier().equals(other.javaProject.getHandleIdentifier())) {
- return false;
- }
- return true;
+ return false;
}
@Override
Modified:
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/AbstractJaxrsElementValidatorDelegate.java
===================================================================
---
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/AbstractJaxrsElementValidatorDelegate.java 2012-10-05
07:01:03 UTC (rev 44331)
+++
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/AbstractJaxrsElementValidatorDelegate.java 2012-10-05
07:03:26 UTC (rev 44332)
@@ -53,13 +53,5 @@
Logger.debug("Reporting problem '{}' on resource '{}'",
message, target.getFullPath().toString());
return markerManager.addProblem(message, preferenceKey, messageArguments, length,
offset, target, quickFixId);
}
-
- public static void deleteJaxrsMarkers(final IResource resource) throws CoreException {
- if (resource == null) {
- return;
- }
- Logger.debug("Clearing JAX-RS markers for resource " + resource.getName());
- resource.deleteMarkers(JaxrsMetamodelValidator.JAXRS_PROBLEM_TYPE, true,
IResource.DEPTH_ONE);
- }
}
Modified:
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsJavaApplicationValidatorDelegate.java
===================================================================
---
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsJavaApplicationValidatorDelegate.java 2012-10-05
07:01:03 UTC (rev 44331)
+++
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsJavaApplicationValidatorDelegate.java 2012-10-05
07:03:26 UTC (rev 44332)
@@ -41,7 +41,8 @@
@Override
public void validate() throws CoreException {
final JaxrsJavaApplication application = getElement();
- deleteJaxrsMarkers(application.getResource());
+ JaxrsMetamodelValidator.deleteJaxrsMarkers(application);
+ Logger.debug("Validating element {}", getElement());
final Annotation applicationPathAnnotation = application
.getAnnotation(EnumJaxrsClassname.APPLICATION_PATH.qualifiedName);
Modified:
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsMetamodelValidator.java
===================================================================
---
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsMetamodelValidator.java 2012-10-05
07:01:03 UTC (rev 44331)
+++
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsMetamodelValidator.java 2012-10-05
07:03:26 UTC (rev 44332)
@@ -39,6 +39,7 @@
import org.jboss.tools.ws.jaxrs.core.JBossJaxrsCorePlugin;
import org.jboss.tools.ws.jaxrs.core.configuration.ProjectNatureUtils;
import org.jboss.tools.ws.jaxrs.core.internal.metamodel.builder.JaxrsMetamodelBuilder;
+import org.jboss.tools.ws.jaxrs.core.internal.metamodel.domain.JaxrsBaseElement;
import org.jboss.tools.ws.jaxrs.core.internal.metamodel.domain.JaxrsHttpMethod;
import org.jboss.tools.ws.jaxrs.core.internal.metamodel.domain.JaxrsJavaApplication;
import org.jboss.tools.ws.jaxrs.core.internal.metamodel.domain.JaxrsMetamodel;
@@ -236,7 +237,6 @@
*/
@SuppressWarnings("incomplete-switch")
private void validate(IJaxrsElement element) throws CoreException {
- Logger.debug("Validating element {}", element);
switch (element.getElementCategory()) {
case METAMODEL:
new JaxrsMetamodelValidatorDelegate(this, (JaxrsMetamodel)element).validate();
@@ -300,6 +300,21 @@
PreferenceInfoManager.register(getProblemType(), new JaxrsPreferenceInfo());
}
+ public static void deleteJaxrsMarkers(final JaxrsBaseElement element) throws
CoreException {
+ if (element == null) {
+ return;
+ }
+ deleteJaxrsMarkers(element.getResource());
+ }
+
+ public static void deleteJaxrsMarkers(final IResource resource) throws CoreException {
+ if (resource == null) {
+ return;
+ }
+ Logger.debug("Clearing JAX-RS markers for resource " + resource.getName());
+ resource.deleteMarkers(JAXRS_PROBLEM_TYPE, true, IResource.DEPTH_ONE);
+ }
+
class JaxrsPreferenceInfo implements IPreferenceInfo{
@Override
Modified:
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsMetamodelValidatorDelegate.java
===================================================================
---
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsMetamodelValidatorDelegate.java 2012-10-05
07:01:03 UTC (rev 44331)
+++
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsMetamodelValidatorDelegate.java 2012-10-05
07:03:26 UTC (rev 44332)
@@ -16,6 +16,7 @@
import org.eclipse.core.runtime.CoreException;
import org.jboss.tools.common.validation.TempMarkerManager;
import org.jboss.tools.ws.jaxrs.core.internal.metamodel.domain.JaxrsMetamodel;
+import org.jboss.tools.ws.jaxrs.core.internal.utils.Logger;
import org.jboss.tools.ws.jaxrs.core.metamodel.IJaxrsApplication;
import org.jboss.tools.ws.jaxrs.core.preferences.JaxrsPreferences;
@@ -35,7 +36,8 @@
public void validate() throws CoreException {
final JaxrsMetamodel metamodel = getElement();
final IProject project = metamodel.getProject();
- deleteJaxrsMarkers(project);
+ JaxrsMetamodelValidator.deleteJaxrsMarkers(project);
+ Logger.debug("Validating element {}", getElement());
final List<IJaxrsApplication> allApplications = metamodel.getAllApplications();
if (allApplications.isEmpty()) {
addProblem(JaxrsValidationMessages.APPLICATION_NO_OCCURRENCE_FOUND,
Modified:
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsResourceMethodValidatorDelegate.java
===================================================================
---
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsResourceMethodValidatorDelegate.java 2012-10-05
07:01:03 UTC (rev 44331)
+++
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsResourceMethodValidatorDelegate.java 2012-10-05
07:03:26 UTC (rev 44332)
@@ -53,6 +53,7 @@
@Override
public void validate() {
+ Logger.debug("Validating element {}", getElement());
final JaxrsResourceMethod resourceMethod = getElement();
try {
resourceMethod.hasErrors(false);
Modified:
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsResourceValidatorDelegate.java
===================================================================
---
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsResourceValidatorDelegate.java 2012-10-05
07:01:03 UTC (rev 44331)
+++
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsResourceValidatorDelegate.java 2012-10-05
07:03:26 UTC (rev 44332)
@@ -14,6 +14,7 @@
import org.jboss.tools.common.validation.TempMarkerManager;
import org.jboss.tools.ws.jaxrs.core.internal.metamodel.domain.JaxrsResource;
import org.jboss.tools.ws.jaxrs.core.internal.metamodel.domain.JaxrsResourceMethod;
+import org.jboss.tools.ws.jaxrs.core.internal.utils.Logger;
import org.jboss.tools.ws.jaxrs.core.metamodel.IJaxrsResourceMethod;
/**
@@ -31,7 +32,8 @@
@Override
public void validate() throws CoreException {
final JaxrsResource resource = getElement();
- deleteJaxrsMarkers(resource.getResource());
+ JaxrsMetamodelValidator.deleteJaxrsMarkers(resource);
+ Logger.debug("Validating element {}", getElement());
for(IJaxrsResourceMethod resourceMethod : resource.getAllMethods()) {
new JaxrsResourceMethodValidatorDelegate(getMarkerManager(), (JaxrsResourceMethod)
resourceMethod).validate();
}
Modified:
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsValidationMessages.java
===================================================================
---
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsValidationMessages.java 2012-10-05
07:01:03 UTC (rev 44331)
+++
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsValidationMessages.java 2012-10-05
07:03:26 UTC (rev 44332)
@@ -24,6 +24,10 @@
+
+
+
+
public static String SEARCHING_RESOURCES;
public static String VALIDATING_RESOURCE;
public static String VALIDATING_PROJECT;
@@ -33,6 +37,7 @@
public static String JAVA_APPLICATION_MISSING_APPLICATION_PATH_ANNOTATION;
public static String JAVA_APPLICATION_INVALID_TYPE_HIERARCHY;
+ public static String HTTP_METHOD_INVALID_HTTP_METHOD_ANNOTATION_VALUE;
public static String HTTP_METHOD_MISSING_RETENTION_ANNOTATION;
public static String HTTP_METHOD_INVALID_RETENTION_ANNOTATION_VALUE;
public static String HTTP_METHOD_MISSING_TARGET_ANNOTATION;
Modified:
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsValidationMessages.properties
===================================================================
---
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsValidationMessages.properties 2012-10-05
07:01:03 UTC (rev 44331)
+++
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsValidationMessages.properties 2012-10-05
07:03:26 UTC (rev 44332)
@@ -7,6 +7,7 @@
JAVA_APPLICATION_MISSING_APPLICATION_PATH_ANNOTATION=The Application Path should be
configured with an @ApplicationPath annotation or in the web deployment descriptor.
JAVA_APPLICATION_INVALID_TYPE_HIERARCHY=Type ''{0}'' should extend
javax.ws.rs.core.Application.
+HTTP_METHOD_INVALID_HTTP_METHOD_ANNOTATION_VALUE=The HTTP Method value cannot be empty.
HTTP_METHOD_MISSING_RETENTION_ANNOTATION=The HTTP Method should have a
@Retention(RetentionPolicy.RUNTIME) annotation on its type.
HTTP_METHOD_INVALID_RETENTION_ANNOTATION_VALUE=The @Retention annotation value is not
correct. It should be RetentionPolicy.RUNTIME
HTTP_METHOD_MISSING_TARGET_ANNOTATION=The HTTP Method should have a
@Target(ElementType.METHOD) annotation on its type.
Modified:
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsWebxmlApplicationValidatorDelegate.java
===================================================================
---
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsWebxmlApplicationValidatorDelegate.java 2012-10-05
07:01:03 UTC (rev 44331)
+++
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsWebxmlApplicationValidatorDelegate.java 2012-10-05
07:03:26 UTC (rev 44332)
@@ -40,7 +40,8 @@
@Override
public void validate() throws CoreException {
JaxrsWebxmlApplication webxmlApplication = getElement();
- deleteJaxrsMarkers(webxmlApplication.getResource());
+ JaxrsMetamodelValidator.deleteJaxrsMarkers(webxmlApplication);
+ Logger.debug("Validating element {}", getElement());
if (webxmlApplication.getMetamodel().hasMultipleApplications()) {
final IResource webxmlResource = webxmlApplication.getResource();
Modified:
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/metamodel/IJaxrsElement.java
===================================================================
---
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/metamodel/IJaxrsElement.java 2012-10-05
07:01:03 UTC (rev 44331)
+++
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/metamodel/IJaxrsElement.java 2012-10-05
07:03:26 UTC (rev 44332)
@@ -1,3 +1,13 @@
+/*******************************************************************************
+ * Copyright (c) 2008 Red Hat, Inc.
+ * Distributed under license by Red Hat, Inc. All rights reserved.
+ * This program is made available under the terms of the
+ * Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at
http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Xavier Coulon - Initial API and implementation
+ ******************************************************************************/
package org.jboss.tools.ws.jaxrs.core.metamodel;
import org.eclipse.core.resources.IResource;
@@ -2,2 +12,7 @@
+/**
+ * Base interface for all JAX-RS elements
+ * @author Xavier Coulon
+ *
+ */
public interface IJaxrsElement {
Modified:
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/preferences/JaxrsPreferences.java
===================================================================
---
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/preferences/JaxrsPreferences.java 2012-10-05
07:01:03 UTC (rev 44331)
+++
trunk/ws/plugins/org.jboss.tools.ws.jaxrs.core/src/org/jboss/tools/ws/jaxrs/core/preferences/JaxrsPreferences.java 2012-10-05
07:03:26 UTC (rev 44332)
@@ -29,6 +29,9 @@
public static final String WARNING_GROUP_ID = "jaxrs";
// HTTP Method group
+ public static final String HTTP_METHOD_INVALID_HTTP_METHOD_ANNOTATION_VALUE = INSTANCE
+ .createSeverityOption("httpMethodInvalidHttpMethodAnnotationValue");
//$NON-NLS-1$
+
public static final String HTTP_METHOD_MISSING_RETENTION_ANNOTATION = INSTANCE
.createSeverityOption("httpMethodMissingRetentionAnnotation");
//$NON-NLS-1$
Modified:
trunk/ws/tests/org.jboss.tools.ws.jaxrs.core.test/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/builder/JavaElementChangedProcessorTestCase.java
===================================================================
---
trunk/ws/tests/org.jboss.tools.ws.jaxrs.core.test/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/builder/JavaElementChangedProcessorTestCase.java 2012-10-05
07:01:03 UTC (rev 44331)
+++
trunk/ws/tests/org.jboss.tools.ws.jaxrs.core.test/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/builder/JavaElementChangedProcessorTestCase.java 2012-10-05
07:03:26 UTC (rev 44332)
@@ -397,6 +397,44 @@
}
@Test
+ public void shouldRemoveApplicationWhenRemovingAnnotationAndHierarchyAlreadyMissing()
throws CoreException {
+ // pre-conditions
+ final IType type =
JdtUtils.resolveType("org.jboss.tools.ws.jaxrs.sample.services.RestApplication",
+ javaProject, progressMonitor);
+ final Annotation appPathAnnotation = getAnnotation(type,
APPLICATION_PATH.qualifiedName);
+ final JaxrsJavaApplication application = new JaxrsJavaApplication(type,
appPathAnnotation, false, metamodel);
+ metamodel.add(application);
+ // operation
+ final JavaElementDelta event = createEvent(appPathAnnotation, REMOVED);
+ final List<JaxrsElementDelta> impacts = processEvent(event, progressMonitor);
+ // verifications
+ assertThat(impacts.size(), equalTo(1));
+ assertThat(impacts.get(0).getElement().getElementCategory(),
equalTo(EnumElementCategory.APPLICATION));
+ assertThat(impacts.get(0).getDeltaKind(), equalTo(REMOVED));
+ assertThat(impacts.get(0).getElement(), is(notNullValue()));
+ assertThat(metamodel.getElements(javaProject).size(), equalTo(0));
+ }
+
+ @Test
+ public void shouldRemoveApplicationWhenRemovingHierarchyAndAnnotationAlreadyMissing()
throws CoreException {
+ // pre-conditions
+ final IType type =
JdtUtils.resolveType("org.jboss.tools.ws.jaxrs.sample.services.RestApplication",
+ javaProject, progressMonitor);
+ WorkbenchUtils.replaceFirstOccurrenceOfCode(type, "extends Application",
"", false);
+ final JaxrsJavaApplication application = new JaxrsJavaApplication(type, null, true,
metamodel);
+ metamodel.add(application);
+ // operation
+ final JavaElementDelta event = createEvent(type, CHANGED,
IJavaElementDeltaFlag.F_SUPER_TYPES);
+ final List<JaxrsElementDelta> impacts = processEvent(event, progressMonitor);
+ // verifications
+ assertThat(impacts.size(), equalTo(1));
+ assertThat(impacts.get(0).getElement().getElementCategory(),
equalTo(EnumElementCategory.APPLICATION));
+ assertThat(impacts.get(0).getDeltaKind(), equalTo(REMOVED));
+ assertThat(impacts.get(0).getElement(), is(notNullValue()));
+ assertThat(metamodel.getElements(javaProject).size(), equalTo(0));
+ }
+
+ @Test
public void shouldDoNothingWhenRemovingUnrelatedAnnotationOnApplication() throws
CoreException {
// pre-conditions
final IType type =
JdtUtils.resolveType("org.jboss.tools.ws.jaxrs.sample.services.RestApplication",
Modified:
trunk/ws/tests/org.jboss.tools.ws.jaxrs.core.test/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/builder/ResourceChangedProcessorTestCase.java
===================================================================
---
trunk/ws/tests/org.jboss.tools.ws.jaxrs.core.test/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/builder/ResourceChangedProcessorTestCase.java 2012-10-05
07:01:03 UTC (rev 44331)
+++
trunk/ws/tests/org.jboss.tools.ws.jaxrs.core.test/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/builder/ResourceChangedProcessorTestCase.java 2012-10-05
07:03:26 UTC (rev 44332)
@@ -103,6 +103,7 @@
/**
* Creates a java annotated type based JAX-RS Application element
+ *
* @param type
* @return
* @throws JavaModelException
@@ -114,6 +115,7 @@
/**
* Creates a java annotated type based JAX-RS Application element
+ *
* @param type
* @param applicationPath
* @return
@@ -131,7 +133,8 @@
* @return
* @throws JavaModelException
*/
- private JaxrsWebxmlApplication createWebxmlApplication(final String
applicationClassName, final String applicationPath) throws JavaModelException {
+ private JaxrsWebxmlApplication createWebxmlApplication(final String
applicationClassName,
+ final String applicationPath) throws JavaModelException {
final IResource webDeploymentDescriptor =
WtpUtils.getWebDeploymentDescriptor(project);
return new JaxrsWebxmlApplication(applicationClassName, applicationPath,
webDeploymentDescriptor, metamodel);
}
@@ -141,11 +144,14 @@
* @throws CoreException
* @throws JavaModelException
*/
- private JaxrsHttpMethod createHttpMethod(EnumJaxrsClassname httpMethodElement) throws
CoreException, JavaModelException {
- final IType httpMethodType = JdtUtils.resolveType(httpMethodElement.qualifiedName,
javaProject, progressMonitor);
+ private JaxrsHttpMethod createHttpMethod(EnumJaxrsClassname httpMethodElement) throws
CoreException,
+ JavaModelException {
+ final IType httpMethodType = JdtUtils
+ .resolveType(httpMethodElement.qualifiedName, javaProject, progressMonitor);
final Annotation httpMethodAnnotation = getAnnotation(httpMethodType,
HTTP_METHOD.qualifiedName);
- final JaxrsHttpMethod httpMethod = new JaxrsHttpMethod.Builder(httpMethodType,
metamodel).httpMethod(httpMethodAnnotation).build();
-
+ final JaxrsHttpMethod httpMethod = new JaxrsHttpMethod.Builder(httpMethodType,
metamodel).httpMethod(
+ httpMethodAnnotation).build();
+
return httpMethod;
}
@@ -153,7 +159,8 @@
final Annotation httpMethodAnnotation = getAnnotation(type,
HTTP_METHOD.qualifiedName);
final Annotation targetAnnotation = getAnnotation(type, TARGET.qualifiedName);
final Annotation retentionAnnotation = getAnnotation(type, RETENTION.qualifiedName);
- final JaxrsHttpMethod httpMethod = new JaxrsHttpMethod.Builder(type,
metamodel).httpMethod(httpMethodAnnotation).target(targetAnnotation).retention(retentionAnnotation).build();
+ final JaxrsHttpMethod httpMethod = new JaxrsHttpMethod.Builder(type, metamodel)
+ .httpMethod(httpMethodAnnotation).target(targetAnnotation).retention(retentionAnnotation).build();
return httpMethod;
}
@@ -197,7 +204,8 @@
// 1 application + 1 HttpMethod + 7 Resources
assertThat(affectedElements.size(), equalTo(9));
assertThat(affectedElements, everyItem(Matchers.<JaxrsElementDelta>
hasProperty("deltaKind", equalTo(ADDED))));
- // all HttpMethods, Resources, ResourceMethods and ResourceFields. only application is
available: the java-based one found in src/main/java
+ // all HttpMethods, Resources, ResourceMethods and ResourceFields. only application is
available: the java-based
+ // one found in src/main/java
assertThat(metamodel.getElements(javaProject).size(), equalTo(35));
}
@@ -216,10 +224,11 @@
metamodel = (JaxrsMetamodel) affectedMetamodel.getMetamodel();
assertThat(metamodel, equalTo((IJaxrsMetamodel) metamodel));
final List<JaxrsElementDelta> affectedElements =
affectedMetamodel.getAffectedElements();
- // 1 application + 1 HttpMethod + 7 Resources
+ // 1 application + 1 HttpMethod + 7 Resources
assertThat(affectedElements.size(), equalTo(9));
assertThat(affectedElements, everyItem(Matchers.<JaxrsElementDelta>
hasProperty("deltaKind", equalTo(ADDED))));
- // all project-specific Applications, HttpMethods, Resources, ResourceMethods and
ResourceFields (built-in HttpMethods are not bound to a project)
+ // all project-specific Applications, HttpMethods, Resources, ResourceMethods and
ResourceFields (built-in
+ // HttpMethods are not bound to a project)
// 2 applications are available: the java-based and the web.xml since a full build was
performed
assertThat(metamodel.getElements(javaProject).size(), equalTo(36));
}
@@ -427,7 +436,8 @@
assertThat(affectedElements.size(), equalTo(1));
assertThat(affectedElements.get(0).getElement().getElementCategory(),
equalTo(EnumElementCategory.APPLICATION));
assertThat(affectedElements.get(0).getDeltaKind(), equalTo(ADDED));
- assertThat(((JaxrsWebxmlApplication)
affectedElements.get(0).getElement()).getApplicationPath(), equalTo("/hello"));
+ assertThat(((JaxrsWebxmlApplication)
affectedElements.get(0).getElement()).getApplicationPath(),
+ equalTo("/hello"));
verify(metamodel, times(1)).add(any(JaxrsWebxmlApplication.class));
assertThat(metamodel.getElements(javaProject).size(), equalTo(1));
}
@@ -457,14 +467,16 @@
assertThat(affectedElements.size(), equalTo(1));
assertThat(affectedElements.get(0).getElement().getElementKind(),
equalTo(EnumElementKind.APPLICATION_WEBXML));
assertThat(affectedElements.get(0).getDeltaKind(), equalTo(ADDED));
- assertThat(((JaxrsWebxmlApplication)
affectedElements.get(0).getElement()).getApplicationPath(), equalTo("/hello"));
+ assertThat(((JaxrsWebxmlApplication)
affectedElements.get(0).getElement()).getApplicationPath(),
+ equalTo("/hello"));
verify(metamodel, times(1)).add(any(JaxrsWebxmlApplication.class));
assertThat(metamodel.getElements(javaProject).size(), equalTo(1));
}
@Test
public void shouldOverrideJavaApplicationWhenAddingCustomServletMapping() throws
Exception {
- // in this test, the java-application exists first, and then a web.xml application is
added -> it should immediately override the java-one
+ // in this test, the java-application exists first, and then a web.xml application is
added -> it should
+ // immediately override the java-one
// pre-conditions
final IType type =
JdtUtils.resolveType("org.jboss.tools.ws.jaxrs.sample.services.RestApplication",
javaProject, progressMonitor);
@@ -485,20 +497,26 @@
assertThat(affectedElements.get(1).getElement().getElementKind(),
equalTo(EnumElementKind.APPLICATION_JAVA));
assertThat(affectedElements.get(1).getDeltaKind(), equalTo(CHANGED));
- final JaxrsJavaApplication javaApplication =
(JaxrsJavaApplication)affectedElements.get(1).getElement();
- assertThat(metamodel.getApplication(), equalTo((IJaxrsApplication)javaApplication)); //
custom web.xml override DOES NOT precede the java based JAX-RS Application element
- assertThat(javaApplication.getApplicationPath(), equalTo("/hello")); //
Java-based application configuration should not be changed
+ final JaxrsJavaApplication javaApplication = (JaxrsJavaApplication)
affectedElements.get(1).getElement();
+ assertThat(metamodel.getApplication(), equalTo((IJaxrsApplication) javaApplication));
// custom web.xml override
+ // DOES NOT precede the
+ // java based JAX-RS
+ // Application element
+ assertThat(javaApplication.getApplicationPath(), equalTo("/hello")); //
Java-based application configuration
+ // should not be changed
assertThat(metamodel.getElements(javaProject).size(), equalTo(2)); // old application
(java) + new one (web.xml)
verify(metamodel, times(1)).add(any(JaxrsWebxmlApplication.class));
}
/**
- * in this test, the webxml exists first, and then an annotated Java Application is
added -> it should be immediately overriden
+ * in this test, the webxml exists first, and then an annotated Java Application is
added -> it should be
+ * immediately overriden
*/
@Test
public void shouldOverrideJavaApplicationWhenAddingAnnotatedJavaApplication() throws
Exception {
// precondition
- final JaxrsWebxmlApplication webxmlApplication =
createWebxmlApplication("org.jboss.tools.ws.jaxrs.sample.services.RestApplication",
"/hello");
+ final JaxrsWebxmlApplication webxmlApplication = createWebxmlApplication(
+ "org.jboss.tools.ws.jaxrs.sample.services.RestApplication",
"/hello");
metamodel.add(webxmlApplication);
final IType type =
JdtUtils.resolveType("org.jboss.tools.ws.jaxrs.sample.services.RestApplication",
javaProject, progressMonitor);
@@ -525,7 +543,8 @@
@Test
public void shouldOverrideJavaApplicationWhenAddingUnannotatedJavaApplication() throws
Exception {
// precondition
- final JaxrsWebxmlApplication webxmlApplication =
createWebxmlApplication("org.jboss.tools.ws.jaxrs.sample.services.RestApplication",
"/hello");
+ final JaxrsWebxmlApplication webxmlApplication = createWebxmlApplication(
+ "org.jboss.tools.ws.jaxrs.sample.services.RestApplication",
"/hello");
metamodel.add(webxmlApplication);
final IType type =
JdtUtils.resolveType("org.jboss.tools.ws.jaxrs.sample.services.RestApplication",
javaProject, progressMonitor);
@@ -545,13 +564,16 @@
}
/**
- * In this test, the java application path override should be removed when the web.xml
application is removed from the web.xml file
+ * In this test, the java application path override should be removed when the web.xml
application is removed from
+ * the web.xml file
+ *
* @throws Exception
*/
@Test
public void shouldUnoverrideAnnotatedJavaApplicationWhenRemovingCustomWebxml() throws
Exception {
// precondition
- final JaxrsWebxmlApplication webxmlApplication =
createWebxmlApplication("org.jboss.tools.ws.jaxrs.sample.services.RestApplication",
"/hello");
+ final JaxrsWebxmlApplication webxmlApplication = createWebxmlApplication(
+ "org.jboss.tools.ws.jaxrs.sample.services.RestApplication",
"/hello");
metamodel.add(webxmlApplication);
final IType type =
JdtUtils.resolveType("org.jboss.tools.ws.jaxrs.sample.services.RestApplication",
javaProject, progressMonitor);
@@ -572,11 +594,12 @@
assertThat(application.getApplicationPath(), equalTo("/app"));
assertThat(metamodel.getElements(javaProject).size(), equalTo(1)); // one (java)
}
-
+
@Test
public void shouldUnoverrideUnannotatedJavaApplicationWhenRemovingCustomWebxml() throws
Exception {
// precondition
- final JaxrsWebxmlApplication webxmlApplication =
createWebxmlApplication("org.jboss.tools.ws.jaxrs.sample.services.RestApplication",
"/hello");
+ final JaxrsWebxmlApplication webxmlApplication = createWebxmlApplication(
+ "org.jboss.tools.ws.jaxrs.sample.services.RestApplication",
"/hello");
metamodel.add(webxmlApplication);
final IType type =
JdtUtils.resolveType("org.jboss.tools.ws.jaxrs.sample.services.RestApplication",
javaProject, progressMonitor);
@@ -598,8 +621,7 @@
assertThat(application.getApplicationPath(), nullValue());
assertThat(metamodel.getElements(javaProject).size(), equalTo(1)); // one (java)
}
-
-
+
@Test
public void shouldNotOverrideJavaApplicationWhenAddingDefaultServletMapping() throws
Exception {
// pre-conditions
@@ -620,18 +642,28 @@
assertThat(webxmlApplication.getApplicationPath(), equalTo("/hello"));
verify(metamodel, times(1)).add(any(JaxrsWebxmlApplication.class));
assertThat(metamodel.getElements(javaProject).size(), equalTo(2)); // old application
(java) + new one (web.xml)
- assertThat(metamodel.getApplication(), equalTo((IJaxrsApplication)webxmlApplication));
// web.xml based application precedes any other java based JAX-RS Application element
- assertThat(metamodel.getJavaApplications().get(0).getApplicationPath(),
equalTo("/app")); // Java-based application configuration should not be changed
+ assertThat(metamodel.getApplication(), equalTo((IJaxrsApplication) webxmlApplication));
// web.xml based
+ // application precedes
+ // any other java based
+ // JAX-RS Application
+ // element
+ assertThat(metamodel.getJavaApplications().get(0).getApplicationPath(),
equalTo("/app")); // Java-based
+ // application
+ // configuration
+ // should not be
+ // changed
}
-
+
/**
- * In this test, the existing Java Application is not modified when adding a web.xml
with default application configuration,
- * but the resulting webxmlApplication becomes the primary one in the metamodel
+ * In this test, the existing Java Application is not modified when adding a web.xml
with default application
+ * configuration, but the resulting webxmlApplication becomes the primary one in the
metamodel
+ *
* @throws Exception
*/
@Test
public void shouldPreceedJavaApplicationWhenAddingDefaultWebxmlMapping() throws
Exception {
- // in this test, the java-application exists first, and then a web.xml application is
added -> it should immediately override the java-one
+ // in this test, the java-application exists first, and then a web.xml application is
added -> it should
+ // immediately override the java-one
// pre-conditions
final IType type =
JdtUtils.resolveType("org.jboss.tools.ws.jaxrs.sample.services.RestApplication",
javaProject, progressMonitor);
@@ -649,21 +681,26 @@
final JaxrsWebxmlApplication webxmlApplication = (JaxrsWebxmlApplication)
affectedElements.get(0).getElement();
assertThat(webxmlApplication.getElementCategory(),
equalTo(EnumElementCategory.APPLICATION));
assertThat(webxmlApplication.getApplicationPath(), equalTo("/hello"));
- assertThat(javaApplication.getApplicationPath(), equalTo("/app")); //
Java-based application configuration should not be changed
+ assertThat(javaApplication.getApplicationPath(), equalTo("/app")); //
Java-based application configuration
+ // should not be changed
assertThat(metamodel.getElements(javaProject).size(), equalTo(2)); // old application
(java) + new one (web.xml)
- assertThat(metamodel.getApplication(), equalTo((IJaxrsApplication)webxmlApplication));
// old application (java) + new one (web.xml)
+ assertThat(metamodel.getApplication(), equalTo((IJaxrsApplication) webxmlApplication));
// old application
+ // (java) + new one
+ // (web.xml)
verify(metamodel, times(1)).add(any(JaxrsWebxmlApplication.class));
}
-
+
@Test
public void shouldRestoreJavaApplicationWhenRemovingDefaultWebxmlMapping() throws
Exception {
- // in this test, the java-application exists first, and then a web.xml application is
added -> it should immediately override the java-one
+ // in this test, the java-application exists first, and then a web.xml application is
added -> it should
+ // immediately override the java-one
// pre-conditions
final IType type =
JdtUtils.resolveType("org.jboss.tools.ws.jaxrs.sample.services.RestApplication",
javaProject, progressMonitor);
final JaxrsJavaApplication javaApplication = createJavaApplication(type);
metamodel.add(javaApplication);
- final JaxrsWebxmlApplication webxmlApplication =
createWebxmlApplication(EnumJaxrsClassname.APPLICATION.qualifiedName,
"/hello");
+ final JaxrsWebxmlApplication webxmlApplication = createWebxmlApplication(
+ EnumJaxrsClassname.APPLICATION.qualifiedName, "/hello");
metamodel.add(webxmlApplication);
// operation
final ResourceDelta event = createEvent(webxmlApplication.getResource(), REMOVED);
@@ -672,14 +709,56 @@
assertThat(affectedElements.size(), equalTo(1));
assertThat(affectedElements.get(0).getDeltaKind(), equalTo(REMOVED));
assertThat(affectedElements.get(0).getElement().getElementKind(),
equalTo(EnumElementKind.APPLICATION_WEBXML));
- assertThat(javaApplication.getApplicationPath(), equalTo("/app")); //
Java-based application configuration should not be changed
+ assertThat(javaApplication.getApplicationPath(), equalTo("/app")); //
Java-based application configuration
+ // should not be changed
assertThat(metamodel.getElements(javaProject).size(), equalTo(1)); // java application
- assertThat(metamodel.getApplication(), equalTo((IJaxrsApplication)javaApplication)); //
old application (java) + new one (web.xml)
+ assertThat(metamodel.getApplication(), equalTo((IJaxrsApplication) javaApplication));
// old application (java)
+ // + new one (web.xml)
verify(metamodel, times(1)).add(any(JaxrsWebxmlApplication.class));
}
-
+
+ @Test
+ public void shouldRemoveApplicationWhenRemovingAnnotationAndHierarchyAlreadyMissing()
throws CoreException {
+ // pre-conditions
+ final IType type =
JdtUtils.resolveType("org.jboss.tools.ws.jaxrs.sample.services.RestApplication",
+ javaProject, progressMonitor);
+ WorkbenchUtils.replaceFirstOccurrenceOfCode(type.getCompilationUnit(), "extends
Application", "", false);
+ metamodel.add(createJavaApplication(type, "/bar"));
+ // operation
+ WorkbenchUtils.replaceFirstOccurrenceOfCode(type.getCompilationUnit(),
"@ApplicationPath(\"/app\")", "", false);
+ final ResourceDelta event = createEvent(type.getResource(), CHANGED);
+ final List<JaxrsElementDelta> affectedElements = processResourceChanges(event,
progressMonitor);
+ // verifications
+ assertThat(affectedElements.size(), equalTo(1));
+ assertThat(affectedElements.get(0).getElement().getElementCategory(),
equalTo(EnumElementCategory.APPLICATION));
+ assertThat(affectedElements.get(0).getDeltaKind(), equalTo(REMOVED));
+ verify(metamodel, times(1)).remove(any(JaxrsJavaApplication.class));
+ assertThat(metamodel.getElements(javaProject).size(), equalTo(0));
+ }
+
+ @Test
+ public void shouldRemoveApplicationWhenRemovingHierarchyAndAnnotationAlreadyMissing()
throws CoreException {
+ // pre-conditions
+ final IType type =
JdtUtils.resolveType("org.jboss.tools.ws.jaxrs.sample.services.RestApplication",
+ javaProject, progressMonitor);
+ WorkbenchUtils.replaceFirstOccurrenceOfCode(type.getCompilationUnit(),
"@ApplicationPath(\"/app\")", "", false);
+ metamodel.add(createJavaApplication(type));
+ // operation
+ WorkbenchUtils.replaceFirstOccurrenceOfCode(type.getCompilationUnit(), "extends
Application", "", false);
+ final ResourceDelta event = createEvent(type.getResource(), CHANGED);
+ final List<JaxrsElementDelta> affectedElements = processResourceChanges(event,
progressMonitor);
+ // verifications
+ assertThat(affectedElements.size(), equalTo(1));
+ assertThat(affectedElements.get(0).getElement().getElementCategory(),
equalTo(EnumElementCategory.APPLICATION));
+ assertThat(affectedElements.get(0).getDeltaKind(), equalTo(REMOVED));
+ verify(metamodel, times(1)).remove(any(JaxrsJavaApplication.class));
+ assertThat(metamodel.getElements(javaProject).size(), equalTo(0));
+
+ }
+
/**
* In this test, the webxml application is changed when the application path is changed,
too.
+ *
* @throws Exception
*/
@Test
@@ -698,14 +777,16 @@
assertThat(affectedElements.get(1).getElement().getElementCategory(),
equalTo(EnumElementCategory.APPLICATION));
assertThat(affectedElements.get(1).getElement().getElementKind(),
equalTo(EnumElementKind.APPLICATION_WEBXML));
assertThat(affectedElements.get(1).getDeltaKind(), equalTo(REMOVED));
- assertThat(((JaxrsWebxmlApplication)
affectedElements.get(0).getElement()).getApplicationPath(), equalTo("/hello"));
+ assertThat(((JaxrsWebxmlApplication)
affectedElements.get(0).getElement()).getApplicationPath(),
+ equalTo("/hello"));
verify(metamodel, times(2)).add(any(JaxrsWebxmlApplication.class)); // initial app
added + new app added, too
verify(metamodel, times(1)).remove(any(JaxrsWebxmlApplication.class)); // initial app
removed
assertThat(metamodel.getElements(javaProject).size(), equalTo(1));
}
-
+
/**
* In this test, the webxml application is changed when the application path is changed,
too.
+ *
* @throws Exception
*/
@Test
@@ -722,10 +803,11 @@
assertThat(affectedElements.size(), equalTo(1));
assertThat(affectedElements.get(0).getElement().getElementKind(),
equalTo(EnumElementKind.APPLICATION_WEBXML));
assertThat(affectedElements.get(0).getDeltaKind(), equalTo(CHANGED));
- assertThat(((JaxrsWebxmlApplication)
affectedElements.get(0).getElement()).getApplicationPath(), equalTo("/hello"));
+ assertThat(((JaxrsWebxmlApplication)
affectedElements.get(0).getElement()).getApplicationPath(),
+ equalTo("/hello"));
assertThat(metamodel.getElements(javaProject).size(), equalTo(1));
}
-
+
@Test
public void shouldNotFailWhenWebxmlWithUnknownServletClass() throws Exception {
// pre-conditions
@@ -734,7 +816,7 @@
assertFalse(removedEntries.isEmpty());
final IResource webxmlResource =
WorkbenchUtils.replaceDeploymentDescriptorWith(javaProject,
"web-3_0-with-invalid-servlet-mapping.xml", bundle);
- //metamodel.add(createApplication("/foo"));
+ // metamodel.add(createApplication("/foo"));
// operation
// operation
final ResourceDelta event = createEvent(webxmlResource, CHANGED);
@@ -756,7 +838,8 @@
assertThat(affectedElements.size(), equalTo(1));
assertThat(affectedElements.get(0).getElement().getElementCategory(),
equalTo(EnumElementCategory.APPLICATION));
assertThat(affectedElements.get(0).getDeltaKind(), equalTo(REMOVED));
- assertThat(((JaxrsWebxmlApplication)
affectedElements.get(0).getElement()).getApplicationPath(), equalTo("/hello"));
+ assertThat(((JaxrsWebxmlApplication)
affectedElements.get(0).getElement()).getApplicationPath(),
+ equalTo("/hello"));
verify(metamodel, times(1)).remove(any(JaxrsWebxmlApplication.class));
assertThat(metamodel.getElements(javaProject).size(), equalTo(0));
}
@@ -765,7 +848,8 @@
public void shouldRemoveWebxmlApplicationWhenRemovingWebxml() throws Exception {
// pre-conditions
// JaxrsMetamodel metamodel = new JaxrsMetamodel(javaProject);
- final JaxrsWebxmlApplication application =
createWebxmlApplication(EnumJaxrsClassname.APPLICATION.qualifiedName,
"/hello");
+ final JaxrsWebxmlApplication application = createWebxmlApplication(
+ EnumJaxrsClassname.APPLICATION.qualifiedName, "/hello");
metamodel.add(application);
final IResource webxmlResource =
WorkbenchUtils.replaceDeploymentDescriptorWith(javaProject,
"web-3_0-with-default-servlet-mapping.xml", bundle);
@@ -787,9 +871,10 @@
// pre-conditions
final IResource webxmlResource =
WorkbenchUtils.replaceDeploymentDescriptorWith(javaProject,
"web-3_0-with-servlet-mapping.xml", bundle);
- final JaxrsWebxmlApplication application =
createWebxmlApplication(EnumJaxrsClassname.APPLICATION.qualifiedName,
"/hello");
+ final JaxrsWebxmlApplication application = createWebxmlApplication(
+ EnumJaxrsClassname.APPLICATION.qualifiedName, "/hello");
metamodel.add(application);
-
+
// operation
final IContainer webInfFolder = webxmlResource.getParent();
webInfFolder.delete(IResource.FORCE, progressMonitor);
@@ -895,7 +980,7 @@
// verifications
assertThat(affectedElements.size(), equalTo(0));
}
-
+
@Test
public void shouldRemoveHttpMethodWhenChangingResource() throws CoreException {
// pre-conditions
@@ -1053,7 +1138,8 @@
// verifications
assertThat(affectedElements.size(), equalTo(1)); // 1 resource method
assertThat(affectedElements.get(0).getDeltaKind(), equalTo(ADDED));
- assertThat(affectedElements.get(0).getElement().getElementCategory(),
equalTo(EnumElementCategory.RESOURCE_METHOD));
+ assertThat(affectedElements.get(0).getElement().getElementCategory(),
+ equalTo(EnumElementCategory.RESOURCE_METHOD));
// 4 HttpMethods + 2 resources (including their methods and fields)
assertThat(metamodel.getElements(javaProject).size(), equalTo(8));
}
@@ -1082,9 +1168,11 @@
// verifications
assertThat(affectedElements.size(), equalTo(2)); // 2 resource methods
assertThat(affectedElements.get(0).getDeltaKind(), equalTo(CHANGED));
- assertThat(affectedElements.get(0).getElement().getElementCategory(),
equalTo(EnumElementCategory.RESOURCE_METHOD));
+ assertThat(affectedElements.get(0).getElement().getElementCategory(),
+ equalTo(EnumElementCategory.RESOURCE_METHOD));
assertThat(affectedElements.get(1).getDeltaKind(), equalTo(CHANGED));
- assertThat(affectedElements.get(1).getElement().getElementCategory(),
equalTo(EnumElementCategory.RESOURCE_METHOD));
+ assertThat(affectedElements.get(1).getElement().getElementCategory(),
+ equalTo(EnumElementCategory.RESOURCE_METHOD));
// 4 HttpMethods + 2 resources (including their methods and fields)
assertThat(metamodel.getElements(javaProject).size(), equalTo(8));
}
@@ -1110,7 +1198,8 @@
// verifications
assertThat(affectedElements.size(), equalTo(1)); // 1 resource method
assertThat(affectedElements.get(0).getDeltaKind(), equalTo(REMOVED));
- assertThat(affectedElements.get(0).getElement().getElementCategory(),
equalTo(EnumElementCategory.RESOURCE_METHOD));
+ assertThat(affectedElements.get(0).getElement().getElementCategory(),
+ equalTo(EnumElementCategory.RESOURCE_METHOD));
// 4 HttpMethods + 1 resource (including their remaining methods and fields)
assertThat(metamodel.getElements(javaProject).size(), equalTo(7));
}
@@ -1131,7 +1220,8 @@
// verifications
assertThat(affectedElements.size(), equalTo(1)); // 1 resource field
assertThat(affectedElements.get(0).getDeltaKind(), equalTo(ADDED));
- assertThat(affectedElements.get(0).getElement().getElementCategory(),
equalTo(EnumElementCategory.RESOURCE_FIELD));
+ assertThat(affectedElements.get(0).getElement().getElementCategory(),
+ equalTo(EnumElementCategory.RESOURCE_FIELD));
// 4 HttpMethods + 2 resources (including their methods and fields)
assertThat(metamodel.getElements(javaProject).size(), equalTo(9));
}
@@ -1160,7 +1250,8 @@
// verifications
assertThat(affectedElements.size(), equalTo(1)); // 1 resource field
assertThat(affectedElements.get(0).getDeltaKind(), equalTo(CHANGED));
- assertThat(affectedElements.get(0).getElement().getElementCategory(),
equalTo(EnumElementCategory.RESOURCE_FIELD));
+ assertThat(affectedElements.get(0).getElement().getElementCategory(),
+ equalTo(EnumElementCategory.RESOURCE_FIELD));
// 4 HttpMethods + 2 resources (including their methods and fields)
assertThat(metamodel.getElements(javaProject).size(), equalTo(9));
}
@@ -1187,7 +1278,8 @@
// verifications
assertThat(affectedElements.size(), equalTo(1)); // 1 resource field
assertThat(affectedElements.get(0).getDeltaKind(), equalTo(REMOVED));
- assertThat(affectedElements.get(0).getElement().getElementCategory(),
equalTo(EnumElementCategory.RESOURCE_FIELD));
+ assertThat(affectedElements.get(0).getElement().getElementCategory(),
+ equalTo(EnumElementCategory.RESOURCE_FIELD));
// 4 HttpMethods + 2 resources (including their methods and fields)
assertThat(metamodel.getElements(javaProject).size(), equalTo(8));
}
Modified:
trunk/ws/tests/org.jboss.tools.ws.jaxrs.core.test/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsApplicationValidatorTestCase.java
===================================================================
---
trunk/ws/tests/org.jboss.tools.ws.jaxrs.core.test/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsApplicationValidatorTestCase.java 2012-10-05
07:01:03 UTC (rev 44331)
+++
trunk/ws/tests/org.jboss.tools.ws.jaxrs.core.test/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsApplicationValidatorTestCase.java 2012-10-05
07:03:26 UTC (rev 44332)
@@ -13,7 +13,6 @@
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.hasSize;
import static org.junit.Assert.assertThat;
-import static org.junit.Assert.fail;
import java.util.List;
@@ -41,8 +40,11 @@
import org.jboss.tools.ws.jaxrs.core.jdt.JdtUtils;
import org.jboss.tools.ws.jaxrs.core.metamodel.EnumElementKind;
import org.jboss.tools.ws.jaxrs.core.metamodel.IJaxrsApplication;
+import static org.jboss.tools.ws.jaxrs.core.preferences.JaxrsPreferences.*;
import org.junit.Test;
+import static org.jboss.tools.ws.jaxrs.core.internal.metamodel.validation.MarkerUtils.*;
+
/**
* @author Xi
*
@@ -62,7 +64,8 @@
* @return
* @throws JavaModelException
*/
- private JaxrsWebxmlApplication createWebxmlApplication(final String
applicationClassName, final String applicationPath) throws JavaModelException {
+ private JaxrsWebxmlApplication createWebxmlApplication(final String
applicationClassName,
+ final String applicationPath) throws JavaModelException {
final IResource webDeploymentDescriptor =
WtpUtils.getWebDeploymentDescriptor(project);
return new JaxrsWebxmlApplication(applicationClassName, applicationPath,
webDeploymentDescriptor, metamodel);
}
@@ -76,13 +79,14 @@
metamodel.remove((JaxrsBaseElement) application);
}
}
- MarkerUtils.deleteJaxrsMarkers(project);
+ deleteJaxrsMarkers(project);
assertThat(metamodel.getAllApplications().size(), equalTo(1));
assertThat(metamodel.getApplication().getElementKind(),
equalTo(EnumElementKind.APPLICATION_JAVA));
// operation
new JaxrsMetamodelValidator().validateAll(project, validationHelper, context,
validatorManager, reporter);
// validation
- assertThat(project.findMarkers(JaxrsMetamodelValidator.JAXRS_PROBLEM_TYPE, false,
0).length, equalTo(0));
+ final IMarker[] markers = findJaxrsMarkers(project);
+ assertThat(markers.length, equalTo(0));
}
@Test
@@ -96,11 +100,12 @@
}
assertThat(metamodel.getAllApplications().size(), equalTo(1));
assertThat(metamodel.getApplication().getElementKind(),
equalTo(EnumElementKind.APPLICATION_WEBXML));
- MarkerUtils.deleteJaxrsMarkers(project);
+ deleteJaxrsMarkers(project);
// operation
new JaxrsMetamodelValidator().validateAll(project, validationHelper, context,
validatorManager, reporter);
// validation
- assertThat(project.findMarkers(JaxrsMetamodelValidator.JAXRS_PROBLEM_TYPE, false,
0).length, equalTo(0));
+ final IMarker[] merkers = findJaxrsMarkers(project);
+ assertThat(merkers.length, equalTo(0));
}
@Test
@@ -110,12 +115,13 @@
for (IJaxrsApplication application : applications) {
metamodel.remove((JaxrsBaseElement) application);
}
- MarkerUtils.deleteJaxrsMarkers(project);
+ deleteJaxrsMarkers(project);
// operation
new JaxrsMetamodelValidator().validateAll(project, validationHelper, context,
validatorManager, reporter);
// validation
- final IMarker[] projectMarkers =
project.findMarkers(JaxrsMetamodelValidator.JAXRS_PROBLEM_TYPE, false, 0);
- assertThat(projectMarkers.length, equalTo(1));
+ final IMarker[] markers = findJaxrsMarkers(project);
+ assertThat(markers.length, equalTo(1));
+ assertThat(markers, hasPreferenceKey(APPLICATION_NO_OCCURRENCE_FOUND));
}
@Test
@@ -123,15 +129,15 @@
// preconditions
final List<IJaxrsApplication> applications = metamodel.getAllApplications();
assertThat(applications, hasSize(2));
- MarkerUtils.deleteJaxrsMarkers(project);
+ deleteJaxrsMarkers(project);
// operation
new JaxrsMetamodelValidator().validateAll(project, validationHelper, context,
validatorManager, reporter);
// validation
- final IMarker[] projectMarkers =
project.findMarkers(JaxrsMetamodelValidator.JAXRS_PROBLEM_TYPE, false, 0);
- assertThat(projectMarkers.length, equalTo(0));
+ final IMarker[] markers = findJaxrsMarkers(project);
+ assertThat(markers.length, equalTo(0));
for (IJaxrsApplication application : metamodel.getAllApplications()) {
- final IMarker[] appMarkers = ((JaxrsBaseElement)
application).getResource().findMarkers(
- JaxrsMetamodelValidator.JAXRS_PROBLEM_TYPE, true, IResource.DEPTH_INFINITE);
+ final IMarker[] appMarkers = findJaxrsMarkers(application);
+ assertThat(appMarkers, hasPreferenceKey(APPLICATION_TOO_MANY_OCCURRENCES));
assertThat(appMarkers.length, equalTo(1));
}
}
@@ -142,7 +148,7 @@
// preconditions
final List<IJaxrsApplication> applications = metamodel.getAllApplications();
assertThat(applications, hasSize(2));
- MarkerUtils.deleteJaxrsMarkers(project);
+ deleteJaxrsMarkers(project);
JaxrsJavaApplication javaApplication = null;
// remove web.xml-based application and remove @ApplicationPath annotation on
java-based application
for (IJaxrsApplication application : applications) {
@@ -158,9 +164,9 @@
// operation
new JaxrsMetamodelValidator().validateAll(project, validationHelper, context,
validatorManager, reporter);
// validation
- final IMarker[] projectMarkers = javaApplication.getJavaElement().getResource()
- .findMarkers(JaxrsMetamodelValidator.JAXRS_PROBLEM_TYPE, false, 0);
- assertThat(projectMarkers.length, equalTo(1));
+ final IMarker[] markers = findJaxrsMarkers(javaApplication);
+ assertThat(markers.length, equalTo(1));
+ assertThat(markers,
hasPreferenceKey(JAVA_APPLICATION_MISSING_APPLICATION_PATH_ANNOTATION));
}
@Test
@@ -170,33 +176,32 @@
javaProject, new NullProgressMonitor());
WorkbenchUtils.replaceAllOccurrencesOfCode(type.getCompilationUnit(), "extends
Application", "", false);
final JaxrsJavaApplication javaApplication = metamodel.getJavaApplications().get(0);
- MarkerUtils.deleteJaxrsMarkers(project);
+ deleteJaxrsMarkers(project);
// operation
new JaxrsMetamodelValidator().validateAll(project, validationHelper, context,
validatorManager, reporter);
// validation
- final IMarker[] projectMarkers = javaApplication.getJavaElement().getResource()
- .findMarkers(JaxrsMetamodelValidator.JAXRS_PROBLEM_TYPE, false, 0);
- assertThat(projectMarkers.length, equalTo(1));
+ final IMarker[] markers = findJaxrsMarkers(javaApplication);
+ assertThat(markers, hasPreferenceKey(JAVA_APPLICATION_INVALID_TYPE_HIERARCHY));
}
@Test
- public void
shouldNotReportProblemOnApplicationIfMissingApplicationPathAnnotationWithOverride()
- throws Exception {
+ public void
shouldNotReportProblemOnApplicationIfMissingApplicationPathAnnotationWithOverride() throws
Exception {
// preconditions
final JaxrsJavaApplication javaApplication = metamodel.getJavaApplications().get(0);
- final Annotation appPathAnnotation =
javaApplication.getAnnotation(EnumJaxrsClassname.APPLICATION_PATH.qualifiedName);
+ final Annotation appPathAnnotation = javaApplication
+ .getAnnotation(EnumJaxrsClassname.APPLICATION_PATH.qualifiedName);
javaApplication.removeAnnotation(appPathAnnotation);
final JaxrsWebxmlApplication webxmlDefaultApplication = (JaxrsWebxmlApplication)
metamodel.getApplication();
metamodel.remove(webxmlDefaultApplication);
- final JaxrsWebxmlApplication webxmlApplication =
createWebxmlApplication(javaApplication.getJavaClassName(), "/foo");
+ final JaxrsWebxmlApplication webxmlApplication =
createWebxmlApplication(javaApplication.getJavaClassName(),
+ "/foo");
metamodel.add(webxmlApplication);
- MarkerUtils.deleteJaxrsMarkers(project);
+ deleteJaxrsMarkers(project);
// operation
new JaxrsMetamodelValidator().validateAll(project, validationHelper, context,
validatorManager, reporter);
// validation
- final IMarker[] projectMarkers = javaApplication.getJavaElement().getResource()
- .findMarkers(JaxrsMetamodelValidator.JAXRS_PROBLEM_TYPE, false, 0);
- assertThat(projectMarkers.length, equalTo(0));
+ final IMarker[] markers = findJaxrsMarkers(javaApplication);
+ assertThat(markers.length, equalTo(0));
}
@Test
@@ -206,12 +211,42 @@
final JaxrsJavaApplication javaApplication = metamodel.getJavaApplications().get(0);
final JaxrsWebxmlApplication webxmlDefaultApplication = (JaxrsWebxmlApplication)
metamodel.getApplication();
metamodel.remove(webxmlDefaultApplication);
- MarkerUtils.deleteJaxrsMarkers(project);
+ deleteJaxrsMarkers(project);
// operation
new JaxrsMetamodelValidator().validateAll(project, validationHelper, context,
validatorManager, reporter);
// validation
- final IMarker[] projectMarkers = javaApplication.getJavaElement().getResource()
- .findMarkers(JaxrsMetamodelValidator.JAXRS_PROBLEM_TYPE, false, 0);
- assertThat(projectMarkers.length, equalTo(0));
+ final IMarker[] markers = findJaxrsMarkers(javaApplication);
+ assertThat(markers.length, equalTo(0));
}
+
+ @Test
+ public void
shouldNotReportProblemOnApplicationWhenAnnotationRemovedAndSuperclassExtensionRemoved()
+ throws CoreException, ValidationException {
+ // preconditions operation #1
+ final JaxrsJavaApplication javaApplication = metamodel.getJavaApplications().get(0);
+ final JaxrsWebxmlApplication webxmlDefaultApplication = (JaxrsWebxmlApplication)
metamodel.getApplication();
+ metamodel.remove(webxmlDefaultApplication);
+ deleteJaxrsMarkers(project);
+ // operation #1: remove annotation and validate
+ LOGGER.warn("*** Operation #1 ***");
+ WorkbenchUtils.replaceAllOccurrencesOfCode(javaApplication.getJavaElement().getCompilationUnit(),
+ "@ApplicationPath(\"/app\")", "", false);
+ LOGGER.warn("*** Validating after Operation #1 ***");
+ new JaxrsMetamodelValidator().validateAll(project, validationHelper, context,
validatorManager, reporter);
+ // validation after operation #1
+ IMarker[] markers = findJaxrsMarkers(javaApplication);
+ assertThat(markers,
hasPreferenceKey(JAVA_APPLICATION_MISSING_APPLICATION_PATH_ANNOTATION));
+ assertThat(markers.length, equalTo(1));
+ // preconditions operation #2
+ deleteJaxrsMarkers(project);
+ // operation #2: remove 'extends Application'
+ LOGGER.warn("*** Operation #2 ***");
+ WorkbenchUtils.replaceAllOccurrencesOfCode(javaApplication.getJavaElement().getCompilationUnit(),
+ "extends Application", "", false);
+ LOGGER.warn("*** Validating after Operation #2 ***");
+ new JaxrsMetamodelValidator().validateAll(project, validationHelper, context,
validatorManager, reporter);
+ // validation after operation #2
+ markers = findJaxrsMarkers(javaApplication);
+ assertThat(markers.length, equalTo(0));
+ }
}
Modified:
trunk/ws/tests/org.jboss.tools.ws.jaxrs.core.test/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsResourceValidatorTestCase.java
===================================================================
---
trunk/ws/tests/org.jboss.tools.ws.jaxrs.core.test/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsResourceValidatorTestCase.java 2012-10-05
07:01:03 UTC (rev 44331)
+++
trunk/ws/tests/org.jboss.tools.ws.jaxrs.core.test/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/JaxrsResourceValidatorTestCase.java 2012-10-05
07:03:26 UTC (rev 44332)
@@ -12,6 +12,10 @@
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
+import static
org.jboss.tools.ws.jaxrs.core.internal.metamodel.validation.MarkerUtils.deleteJaxrsMarkers;
+import static
org.jboss.tools.ws.jaxrs.core.internal.metamodel.validation.MarkerUtils.findJaxrsMarkers;
+import static
org.jboss.tools.ws.jaxrs.core.internal.metamodel.validation.MarkerUtils.hasPreferenceKey;
+import static
org.jboss.tools.ws.jaxrs.core.preferences.JaxrsPreferences.RESOURCE_METHOD_UNBOUND_PATH_ANNOTATION_TEMPLATE_PARAMETER;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.fail;
@@ -31,7 +35,6 @@
import org.eclipse.wst.validation.internal.provisional.core.IReporter;
import org.jboss.tools.common.validation.ContextValidationHelper;
import org.jboss.tools.common.validation.IProjectValidationContext;
-import org.jboss.tools.common.validation.ValidationErrorManager;
import org.jboss.tools.common.validation.ValidatorManager;
import org.jboss.tools.common.validation.internal.ProjectValidationContext;
import org.jboss.tools.ws.jaxrs.core.WorkbenchUtils;
@@ -39,7 +42,6 @@
import org.jboss.tools.ws.jaxrs.core.internal.metamodel.domain.JaxrsBaseElement;
import org.jboss.tools.ws.jaxrs.core.internal.metamodel.domain.JaxrsResource;
import org.jboss.tools.ws.jaxrs.core.internal.metamodel.domain.JaxrsResourceMethod;
-import org.jboss.tools.ws.jaxrs.core.preferences.JaxrsPreferences;
import org.junit.Test;
/**
@@ -66,12 +68,13 @@
final IType customerJavaType = WorkbenchUtils.getType(
"org.jboss.tools.ws.jaxrs.sample.services.CustomerResource", javaProject);
final JaxrsBaseElement customerResource = (JaxrsBaseElement)
metamodel.getElement(customerJavaType);
- MarkerUtils.deleteJaxrsMarkers(customerResource);
+ deleteJaxrsMarkers(customerResource);
// operation
new JaxrsMetamodelValidator().validate(toSet(customerResource.getResource()), project,
validationHelper,
context, validatorManager, reporter);
// validation
- assertThat(MarkerUtils.findJaxrsMarkers(customerResource).length, equalTo(0));
+ final IMarker[] markers = findJaxrsMarkers(customerResource);
+ assertThat(markers.length, equalTo(0));
}
@Test
@@ -80,22 +83,20 @@
final IType barJavaType =
WorkbenchUtils.getType("org.jboss.tools.ws.jaxrs.sample.services.BarResource",
javaProject);
final JaxrsResource barResource = metamodel.getElement(barJavaType,
JaxrsResource.class);
- MarkerUtils.deleteJaxrsMarkers(barResource);
+ deleteJaxrsMarkers(barResource);
// operation
new JaxrsMetamodelValidator().validate(toSet(barResource.getResource()), project,
validationHelper, context,
validatorManager, reporter);
// validation
- final IMarker[] markers = MarkerUtils.findJaxrsMarkers(barResource);
+ final IMarker[] markers = findJaxrsMarkers(barResource);
assertThat(markers.length, equalTo(8));
final Map<String, JaxrsResourceMethod> resourceMethods =
barResource.getMethods();
for (Entry<String, JaxrsResourceMethod> entry : resourceMethods.entrySet()) {
- final IMarker[] methodMarkers = MarkerUtils.findJaxrsMarkers(entry.getValue());
+ final IMarker[] methodMarkers = findJaxrsMarkers(entry.getValue());
if (entry.getKey().contains("getContent1")) {
assertThat(entry.getValue().hasErrors(), is(true));
assertThat(methodMarkers.length, equalTo(1));
- assertThat(methodMarkers[0].getType(),
equalTo(JaxrsMetamodelValidator.JAXRS_PROBLEM_TYPE));
- assertThat(methodMarkers[0].getAttribute(ValidationErrorManager.PREFERENCE_KEY_ATTRIBUTE_NAME,
""),
- equalTo(JaxrsPreferences.RESOURCE_METHOD_UNBOUND_PATH_ANNOTATION_TEMPLATE_PARAMETER));
+ assertThat(methodMarkers,
hasPreferenceKey(RESOURCE_METHOD_UNBOUND_PATH_ANNOTATION_TEMPLATE_PARAMETER));
} else if (entry.getKey().contains("getContent2")) {
assertThat(entry.getValue().hasErrors(), is(true));
assertThat(methodMarkers.length, equalTo(3));
@@ -120,22 +121,20 @@
final IType barJavaType =
WorkbenchUtils.getType("org.jboss.tools.ws.jaxrs.sample.services.BazResource",
javaProject);
final JaxrsResource barResource = metamodel.getElement(barJavaType,
JaxrsResource.class);
- MarkerUtils.deleteJaxrsMarkers(barResource);
+ deleteJaxrsMarkers(barResource);
// operation
new JaxrsMetamodelValidator().validate(toSet(barResource.getResource()), project,
validationHelper, context,
validatorManager, reporter);
// validation
- final IMarker[] markers = MarkerUtils.findJaxrsMarkers(barResource);
+ final IMarker[] markers = findJaxrsMarkers(barResource);
assertThat(markers.length, equalTo(6));
final Map<String, JaxrsResourceMethod> resourceMethods =
barResource.getMethods();
for (Entry<String, JaxrsResourceMethod> entry : resourceMethods.entrySet()) {
- final IMarker[] methodMarkers = MarkerUtils.findJaxrsMarkers(entry.getValue());
+ final IMarker[] methodMarkers = findJaxrsMarkers(entry.getValue());
if (entry.getKey().contains("getContent1")) {
assertThat(entry.getValue().hasErrors(), is(true));
assertThat(methodMarkers.length, equalTo(1));
- assertThat(methodMarkers[0].getType(),
equalTo(JaxrsMetamodelValidator.JAXRS_PROBLEM_TYPE));
- assertThat(methodMarkers[0].getAttribute(ValidationErrorManager.PREFERENCE_KEY_ATTRIBUTE_NAME,
""),
- equalTo(JaxrsPreferences.RESOURCE_METHOD_UNBOUND_PATH_ANNOTATION_TEMPLATE_PARAMETER));
+ assertThat(methodMarkers,
hasPreferenceKey(RESOURCE_METHOD_UNBOUND_PATH_ANNOTATION_TEMPLATE_PARAMETER));
} else if (entry.getKey().contains("getContent2")) {
assertThat(entry.getValue().hasErrors(), is(true));
assertThat(methodMarkers.length, equalTo(2));
Modified:
trunk/ws/tests/org.jboss.tools.ws.jaxrs.core.test/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/MarkerUtils.java
===================================================================
---
trunk/ws/tests/org.jboss.tools.ws.jaxrs.core.test/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/MarkerUtils.java 2012-10-05
07:01:03 UTC (rev 44331)
+++
trunk/ws/tests/org.jboss.tools.ws.jaxrs.core.test/src/org/jboss/tools/ws/jaxrs/core/internal/metamodel/validation/MarkerUtils.java 2012-10-05
07:03:26 UTC (rev 44332)
@@ -8,8 +8,13 @@
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.ISourceRange;
+import org.hamcrest.BaseMatcher;
+import org.hamcrest.Description;
+import org.hamcrest.Matcher;
+import org.jboss.tools.common.validation.ValidationErrorManager;
import org.jboss.tools.ws.jaxrs.core.internal.metamodel.domain.JaxrsBaseElement;
import org.jboss.tools.ws.jaxrs.core.internal.metamodel.domain.JaxrsResourceMethod;
+import org.jboss.tools.ws.jaxrs.core.metamodel.IJaxrsElement;
/**
* @author Xavier Coulon
@@ -22,8 +27,9 @@
* @return
* @throws CoreException
*/
- public static IMarker[] findJaxrsMarkers(final JaxrsBaseElement element) throws
CoreException {
+ public static IMarker[] findJaxrsMarkers(final IJaxrsElement element) throws
CoreException {
switch (element.getElementCategory()) {
+ case APPLICATION:
case HTTP_METHOD:
case RESOURCE:
return element.getResource().findMarkers(JaxrsMetamodelValidator.JAXRS_PROBLEM_TYPE,
true,
@@ -47,6 +53,10 @@
}
}
+ public static IMarker[] findJaxrsMarkers(IProject project) throws CoreException {
+ return project.findMarkers(JaxrsMetamodelValidator.JAXRS_PROBLEM_TYPE, false, 0);
+ }
+
/**
* @param element
* @throws CoreException
@@ -63,5 +73,40 @@
public static void deleteJaxrsMarkers(final IProject project) throws CoreException {
project.deleteMarkers(JaxrsMetamodelValidator.JAXRS_PROBLEM_TYPE, false,
IResource.DEPTH_INFINITE);
}
+
+ public static Matcher<IMarker[]> hasPreferenceKey(String
javaApplicationInvalidTypeHierarchy) {
+ return new MarkerPreferenceKeyMatcher(javaApplicationInvalidTypeHierarchy);
+ }
+
+ static class MarkerPreferenceKeyMatcher extends BaseMatcher<IMarker[]> {
+
+ final String expectedProblemType;
+
+ MarkerPreferenceKeyMatcher(final String expectedProblemType) {
+ this.expectedProblemType = expectedProblemType;
+ }
+ @Override
+ public boolean matches(Object item) {
+ if(item instanceof IMarker[]) {
+ for(IMarker marker : (IMarker[]) item) {
+ final String preferenceKey =
marker.getAttribute(ValidationErrorManager.PREFERENCE_KEY_ATTRIBUTE_NAME, "");
+ if(preferenceKey.equals(expectedProblemType)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public void describeTo(Description description) {
+ description.appendText("marker contains preference_key (\"" +
expectedProblemType + "\" problem type)");
+ }
+
+ }
+
+
+
+
}
\ No newline at end of file