From 785ce1deb9a72ad68aabe2ff731e5357b5cb6c69 Mon Sep 17 00:00:00 2001 From: jamesagnew Date: Fri, 17 Jun 2016 07:40:17 -0400 Subject: [PATCH] Remove some dead code and improve test coverage --- ...BaseRuntimeElementCompositeDefinition.java | 7 - .../fhir/context/RuntimeChildExtensionDt.java | 40 ------ .../RuntimeChildXhtmlDatatypeDefinition.java | 40 ------ .../ca/uhn/fhir/rest/client/BaseClient.java | 8 +- .../rest/client/RestfulClientFactory.java | 3 +- .../rest/client/apache/ApacheHttpRequest.java | 32 +++-- .../fhir/rest/client/api/IHttpRequest.java | 10 ++ .../java/ca/uhn/fhir/rest/method/Util.java | 54 ------- .../ca/uhn/fhir/i18n/hapi-messages.properties | 5 +- .../fhir/jaxrs/client/JaxRsHttpRequest.java | 10 ++ .../ca/uhn/fhir/jpa/dao/HistoryTuple.java | 79 ---------- ...scriptionWebsocketHandlerFactoryDstu2.java | 42 ------ ...scriptionWebsocketHandlerFactoryDstu3.java | 42 ------ .../exceptions/ExceptionPropertiesTest.java | 11 ++ .../fhir/parser/ErrorHandlerAdapterTest.java | 24 +++- .../rest/client/GenericClientDstu3Test.java | 136 ++++++++++++++---- ...rchWithServerAddressStrategyDstu3Test.java | 52 ++++++- 17 files changed, 240 insertions(+), 355 deletions(-) delete mode 100644 hapi-fhir-base/src/main/java/ca/uhn/fhir/context/RuntimeChildExtensionDt.java delete mode 100644 hapi-fhir-base/src/main/java/ca/uhn/fhir/context/RuntimeChildXhtmlDatatypeDefinition.java delete mode 100644 hapi-fhir-base/src/main/java/ca/uhn/fhir/rest/method/Util.java delete mode 100644 hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/HistoryTuple.java delete mode 100644 hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/subscription/SubscriptionWebsocketHandlerFactoryDstu2.java delete mode 100644 hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/subscription/SubscriptionWebsocketHandlerFactoryDstu3.java rename hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/provider/dstu3/BaseJpaResourceProviderQuestionnaireResponseDstu3.java => hapi-fhir-structures-dstu3/src/test/java/ca/uhn/fhir/parser/ErrorHandlerAdapterTest.java (54%) diff --git a/hapi-fhir-base/src/main/java/ca/uhn/fhir/context/BaseRuntimeElementCompositeDefinition.java b/hapi-fhir-base/src/main/java/ca/uhn/fhir/context/BaseRuntimeElementCompositeDefinition.java index e8d406a2a40..d8e6a27d4f0 100644 --- a/hapi-fhir-base/src/main/java/ca/uhn/fhir/context/BaseRuntimeElementCompositeDefinition.java +++ b/hapi-fhir-base/src/main/java/ca/uhn/fhir/context/BaseRuntimeElementCompositeDefinition.java @@ -354,11 +354,6 @@ public abstract class BaseRuntimeElementCompositeDefinition ext RuntimeChildChoiceDefinition def = new RuntimeChildChoiceDefinition(next, elementName, childAnnotation, descriptionAnnotation, choiceTypes); orderMap.put(order, def); - } else if (next.getType().equals(ExtensionDt.class)) { - - RuntimeChildExtensionDt def = new RuntimeChildExtensionDt(next, elementName, childAnnotation, descriptionAnnotation); - orderMap.put(order, def); - } else if (extensionAttr != null) { /* * Child is an extension @@ -427,8 +422,6 @@ public abstract class BaseRuntimeElementCompositeDefinition ext } else { def = new RuntimeChildPrimitiveDatatypeDefinition(next, elementName, descriptionAnnotation, childAnnotation, nextDatatype); } - } else if (IBaseXhtml.class.isAssignableFrom(nextElementType)) { - def = new RuntimeChildXhtmlDatatypeDefinition(next, elementName, descriptionAnnotation, childAnnotation, nextDatatype); } else { if (IBoundCodeableConcept.class.isAssignableFrom(nextElementType)) { IValueSetEnumBinder> binder = ModelScanner.getBoundCodeBinder(next); diff --git a/hapi-fhir-base/src/main/java/ca/uhn/fhir/context/RuntimeChildExtensionDt.java b/hapi-fhir-base/src/main/java/ca/uhn/fhir/context/RuntimeChildExtensionDt.java deleted file mode 100644 index 74b93fdc68d..00000000000 --- a/hapi-fhir-base/src/main/java/ca/uhn/fhir/context/RuntimeChildExtensionDt.java +++ /dev/null @@ -1,40 +0,0 @@ -package ca.uhn.fhir.context; - -/* - * #%L - * HAPI FHIR - Core Library - * %% - * Copyright (C) 2014 - 2016 University Health Network - * %% - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * #L% - */ - -import java.lang.reflect.Field; - -import ca.uhn.fhir.model.api.ExtensionDt; -import ca.uhn.fhir.model.api.IElement; -import ca.uhn.fhir.model.api.annotation.Child; -import ca.uhn.fhir.model.api.annotation.Description; - -public class RuntimeChildExtensionDt extends RuntimeChildAny { - - public RuntimeChildExtensionDt(Field theField, String theElementName, Child theChildAnnotation, Description theDescriptionAnnotation) { - super(theField, theElementName, theChildAnnotation, theDescriptionAnnotation); - } - - public IElement newInstance() { - return new ExtensionDt(); - } - -} diff --git a/hapi-fhir-base/src/main/java/ca/uhn/fhir/context/RuntimeChildXhtmlDatatypeDefinition.java b/hapi-fhir-base/src/main/java/ca/uhn/fhir/context/RuntimeChildXhtmlDatatypeDefinition.java deleted file mode 100644 index 791fa3787d7..00000000000 --- a/hapi-fhir-base/src/main/java/ca/uhn/fhir/context/RuntimeChildXhtmlDatatypeDefinition.java +++ /dev/null @@ -1,40 +0,0 @@ -package ca.uhn.fhir.context; - -/* - * #%L - * HAPI FHIR - Core Library - * %% - * Copyright (C) 2014 - 2016 University Health Network - * %% - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * #L% - */ - -import java.lang.reflect.Field; - -import org.hl7.fhir.instance.model.api.IBase; - -import ca.uhn.fhir.model.api.annotation.Child; -import ca.uhn.fhir.model.api.annotation.Description; - -/** - * HL7org XHTML type - */ -public class RuntimeChildXhtmlDatatypeDefinition extends RuntimeChildPrimitiveDatatypeDefinition { - - public RuntimeChildXhtmlDatatypeDefinition(Field theField, String theElementName, Description theDescriptionAnnotation, Child theChildAnnotation, Class theDatatype) { - super(theField, theElementName, theDescriptionAnnotation, theChildAnnotation, theDatatype); - } - - -} diff --git a/hapi-fhir-base/src/main/java/ca/uhn/fhir/rest/client/BaseClient.java b/hapi-fhir-base/src/main/java/ca/uhn/fhir/rest/client/BaseClient.java index 4386e9a7d35..1da6d932a4a 100644 --- a/hapi-fhir-base/src/main/java/ca/uhn/fhir/rest/client/BaseClient.java +++ b/hapi-fhir-base/src/main/java/ca/uhn/fhir/rest/client/BaseClient.java @@ -209,7 +209,7 @@ public abstract class BaseClient implements IRestfulClient { // TODO: handle non 2xx status codes by throwing the correct exception, // and ensure it's passed upwards - IHttpRequest httpRequest; + IHttpRequest httpRequest = null; IHttpResponse response = null; try { Map> params = createExtraParams(); @@ -355,11 +355,13 @@ public abstract class BaseClient implements IRestfulClient { } } catch (DataFormatException e) { - throw new FhirClientConnectionException(e); + String msg = getFhirContext().getLocalizer().getMessage(BaseClient.class, "failedToParseResponse", httpRequest.getHttpVerbName(), httpRequest.getUri(), e.toString()); + throw new FhirClientConnectionException(msg, e); } catch (IllegalStateException e) { throw new FhirClientConnectionException(e); } catch (IOException e) { - throw new FhirClientConnectionException(e); + String msg = getFhirContext().getLocalizer().getMessage(BaseClient.class, "ioExceptionDuringOperation", httpRequest.getHttpVerbName(), httpRequest.getUri(), e.toString()); + throw new FhirClientConnectionException(msg, e); } catch (RuntimeException e) { throw e; } catch (Exception e) { diff --git a/hapi-fhir-base/src/main/java/ca/uhn/fhir/rest/client/RestfulClientFactory.java b/hapi-fhir-base/src/main/java/ca/uhn/fhir/rest/client/RestfulClientFactory.java index 080e1a63987..df14bf81474 100644 --- a/hapi-fhir-base/src/main/java/ca/uhn/fhir/rest/client/RestfulClientFactory.java +++ b/hapi-fhir-base/src/main/java/ca/uhn/fhir/rest/client/RestfulClientFactory.java @@ -300,7 +300,8 @@ public abstract class RestfulClientFactory implements IRestfulClientFactory { Class implementingClass = myContext.getResourceDefinition("Conformance").getImplementingClass(); conformance = (IBaseResource) client.fetchConformance().ofType(implementingClass).execute(); } catch (FhirClientConnectionException e) { - throw new FhirClientConnectionException(myContext.getLocalizer().getMessage(RestfulClientFactory.class, "failedToRetrieveConformance", theServerBase + Constants.URL_TOKEN_METADATA), e); + String msg = myContext.getLocalizer().getMessage(RestfulClientFactory.class, "failedToRetrieveConformance", theServerBase + Constants.URL_TOKEN_METADATA); + throw new FhirClientConnectionException(msg, e); } FhirTerser t = myContext.newTerser(); diff --git a/hapi-fhir-base/src/main/java/ca/uhn/fhir/rest/client/apache/ApacheHttpRequest.java b/hapi-fhir-base/src/main/java/ca/uhn/fhir/rest/client/apache/ApacheHttpRequest.java index 8a35e334b48..e5cf6bfb4ec 100644 --- a/hapi-fhir-base/src/main/java/ca/uhn/fhir/rest/client/apache/ApacheHttpRequest.java +++ b/hapi-fhir-base/src/main/java/ca/uhn/fhir/rest/client/apache/ApacheHttpRequest.java @@ -44,8 +44,8 @@ import ca.uhn.fhir.rest.client.api.IHttpResponse; */ public class ApacheHttpRequest implements IHttpRequest { - private HttpRequestBase myRequest; private HttpClient myClient; + private HttpRequestBase myRequest; public ApacheHttpRequest(HttpClient theClient, HttpRequestBase theApacheRequest) { this.myClient = theClient; @@ -57,14 +57,6 @@ public class ApacheHttpRequest implements IHttpRequest { myRequest.addHeader(theName, theValue); } - /** - * Get the ApacheRequest - * @return the ApacheRequest - */ - public HttpRequestBase getApacheRequest() { - return myRequest; - } - @Override public IHttpResponse execute() throws IOException { return new ApacheHttpResponse(myClient.execute(myRequest)); @@ -82,9 +74,17 @@ public class ApacheHttpRequest implements IHttpRequest { return result; } + /** + * Get the ApacheRequest + * @return the ApacheRequest + */ + public HttpRequestBase getApacheRequest() { + return myRequest; + } + @Override - public String toString() { - return myRequest.toString(); + public String getHttpVerbName() { + return myRequest.getMethod(); } @Override @@ -98,4 +98,14 @@ public class ApacheHttpRequest implements IHttpRequest { return null; } + @Override + public String getUri() { + return myRequest.getURI().toString(); + } + + @Override + public String toString() { + return myRequest.toString(); + } + } diff --git a/hapi-fhir-base/src/main/java/ca/uhn/fhir/rest/client/api/IHttpRequest.java b/hapi-fhir-base/src/main/java/ca/uhn/fhir/rest/client/api/IHttpRequest.java index ceb54ad576f..9e800060dd6 100644 --- a/hapi-fhir-base/src/main/java/ca/uhn/fhir/rest/client/api/IHttpRequest.java +++ b/hapi-fhir-base/src/main/java/ca/uhn/fhir/rest/client/api/IHttpRequest.java @@ -56,4 +56,14 @@ public interface IHttpRequest { */ public String getRequestBodyFromStream() throws IOException; + /** + * Return the request URI, or null + */ + public String getUri(); + + /** + * Return the HTTP verb (e.g. "GET") + */ + public String getHttpVerbName(); + } diff --git a/hapi-fhir-base/src/main/java/ca/uhn/fhir/rest/method/Util.java b/hapi-fhir-base/src/main/java/ca/uhn/fhir/rest/method/Util.java deleted file mode 100644 index 053e74dc4b1..00000000000 --- a/hapi-fhir-base/src/main/java/ca/uhn/fhir/rest/method/Util.java +++ /dev/null @@ -1,54 +0,0 @@ -package ca.uhn.fhir.rest.method; - -/* - * #%L - * HAPI FHIR - Core Library - * %% - * Copyright (C) 2014 - 2016 University Health Network - * %% - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * #L% - */ - -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; -import java.util.HashMap; -import java.util.Map; - -/** - * Created by dsotnikov on 2/25/2014. - */ -class Util { -// public static Integer findCountParameterIndex(Method theMethod) { -// return findParamIndex(theMethod, Count.class); -// } - - - public static Map getQueryParams(String query) { - try { - - Map params = new HashMap(); - for (String param : query.split("&")) { - String[] pair = param.split("="); - String key = URLDecoder.decode(pair[0], "UTF-8"); - String value = URLDecoder.decode(pair[1], "UTF-8"); - - params.put(key, value); - } - return params; - } catch (UnsupportedEncodingException ex) { - throw new AssertionError(ex); - } - } - -} diff --git a/hapi-fhir-base/src/main/resources/ca/uhn/fhir/i18n/hapi-messages.properties b/hapi-fhir-base/src/main/resources/ca/uhn/fhir/i18n/hapi-messages.properties index a300ce63f50..834ea081e80 100644 --- a/hapi-fhir-base/src/main/resources/ca/uhn/fhir/i18n/hapi-messages.properties +++ b/hapi-fhir-base/src/main/resources/ca/uhn/fhir/i18n/hapi-messages.properties @@ -7,11 +7,14 @@ ca.uhn.fhir.context.FhirContext.noStructuresForSpecifiedVersion=Could not find t ca.uhn.fhir.context.RuntimeResourceDefinition.nonInstantiableType=Resource type "{0}" can not be instantiated. Check that this class has a no-argument constructor, and that it is static if it is a nested type. Error is: {1} +ca.uhn.fhir.rest.client.BaseClient.ioExceptionDuringOperation=Encountered IOException when performing {0} to URL {1} - {2} +ca.uhn.fhir.rest.client.BaseClient.failedToParseResponse=Failed to parse response from server when performing {0} to URL {1} - {2} + ca.uhn.fhir.rest.client.GenericClient.noPagingLinkFoundInBundle=Can not perform paging operation because no link was found in Bundle with relation "{0}" ca.uhn.fhir.rest.client.GenericClient.noVersionIdForVread=No version specified in URL for 'vread' operation: {0} ca.uhn.fhir.rest.client.GenericClient.incompleteUriForRead=The given URI is not an absolute URL and is not usable for this operation: {0} ca.uhn.fhir.rest.client.GenericClient.cannotDetermineResourceTypeFromUri=Unable to determine the resource type from the given URI: {0} -ca.uhn.fhir.rest.client.RestfulClientFactory.failedToRetrieveConformance=Failed to retrieve the server's metadata statement during client initialization. URL used was: {0} +ca.uhn.fhir.rest.client.RestfulClientFactory.failedToRetrieveConformance=Failed to retrieve the server metadata statement during client initialization. URL used was {0} ca.uhn.fhir.rest.client.RestfulClientFactory.wrongVersionInConformance=The server at base URL "{0}" returned a conformance statement indicating that it supports FHIR version "{1}" which corresponds to {2}, but this client is configured to use {3} (via the FhirContext). ca.uhn.fhir.rest.method.BaseOutcomeReturningMethodBindingWithResourceParam.incorrectIdForUpdate=Can not update resource, resource body must contain an ID element which matches the request URL for update (PUT) operation - Resource body ID of "{0}" does not match URL ID of "{1}" diff --git a/hapi-fhir-jaxrsserver-base/src/main/java/ca/uhn/fhir/jaxrs/client/JaxRsHttpRequest.java b/hapi-fhir-jaxrsserver-base/src/main/java/ca/uhn/fhir/jaxrs/client/JaxRsHttpRequest.java index f528ac1d1e6..b7e3f8bb8d1 100644 --- a/hapi-fhir-jaxrsserver-base/src/main/java/ca/uhn/fhir/jaxrs/client/JaxRsHttpRequest.java +++ b/hapi-fhir-jaxrsserver-base/src/main/java/ca/uhn/fhir/jaxrs/client/JaxRsHttpRequest.java @@ -103,4 +103,14 @@ public class JaxRsHttpRequest implements IHttpRequest { return null; } + @Override + public String getUri() { + return ""; // TODO: can we get this from somewhere? + } + + @Override + public String getHttpVerbName() { + return myRequestType.name(); + } + } diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/HistoryTuple.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/HistoryTuple.java deleted file mode 100644 index 4e632dd30cc..00000000000 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/HistoryTuple.java +++ /dev/null @@ -1,79 +0,0 @@ -package ca.uhn.fhir.jpa.dao; - -/* - * #%L - * HAPI FHIR JPA Server - * %% - * Copyright (C) 2014 - 2016 University Health Network - * %% - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * #L% - */ - -import java.util.Date; - -import org.apache.commons.lang3.builder.ToStringBuilder; -import org.apache.commons.lang3.builder.ToStringStyle; - -class HistoryTuple implements Comparable { - - private Long myId; - private boolean myIsHistory; - private Date myUpdated; - - public HistoryTuple(boolean theIsHistory, Date theUpdated, Long theId) { - super(); - myIsHistory = theIsHistory; - myUpdated = theUpdated; - myId = theId; - } - - @Override - public int compareTo(HistoryTuple theO) { - return myUpdated.compareTo(theO.myUpdated); - } - - public Long getId() { - return myId; - } - - public boolean isHistory() { - return myIsHistory; - } - - public Date getUpdated() { - return myUpdated; - } - - public void setId(Long theId) { - myId = theId; - } - - public void setIsHistory(boolean theIsHistory) { - myIsHistory = theIsHistory; - } - - public void setUpdated(Date theUpdated) { - myUpdated = theUpdated; - } - - @Override - public String toString() { - ToStringBuilder b = new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE); - b.append("id", myId); - b.append("history", myIsHistory); - b.append("updated", myUpdated); - return b.build(); - } - -} diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/subscription/SubscriptionWebsocketHandlerFactoryDstu2.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/subscription/SubscriptionWebsocketHandlerFactoryDstu2.java deleted file mode 100644 index f4bacf4e6b0..00000000000 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/subscription/SubscriptionWebsocketHandlerFactoryDstu2.java +++ /dev/null @@ -1,42 +0,0 @@ -package ca.uhn.fhir.jpa.subscription; - -/* - * #%L - * HAPI FHIR JPA Server - * %% - * Copyright (C) 2014 - 2016 University Health Network - * %% - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * #L% - */ - -import org.springframework.beans.factory.FactoryBean; - -public class SubscriptionWebsocketHandlerFactoryDstu2 implements FactoryBean { - static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(SubscriptionWebsocketHandlerDstu2.class); - - @Override - public ISubscriptionWebsocketHandler getObject() throws Exception { - return new SubscriptionWebsocketHandlerDstu2(); - } - - @Override - public Class getObjectType() { - return ISubscriptionWebsocketHandler.class; - } - - @Override - public boolean isSingleton() { - return false; - } -} diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/subscription/SubscriptionWebsocketHandlerFactoryDstu3.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/subscription/SubscriptionWebsocketHandlerFactoryDstu3.java deleted file mode 100644 index f43e36f0835..00000000000 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/subscription/SubscriptionWebsocketHandlerFactoryDstu3.java +++ /dev/null @@ -1,42 +0,0 @@ -package ca.uhn.fhir.jpa.subscription; - -/* - * #%L - * HAPI FHIR JPA Server - * %% - * Copyright (C) 2014 - 2016 University Health Network - * %% - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * #L% - */ - -import org.springframework.beans.factory.FactoryBean; - -public class SubscriptionWebsocketHandlerFactoryDstu3 implements FactoryBean { - static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(SubscriptionWebsocketHandlerDstu3.class); - - @Override - public ISubscriptionWebsocketHandler getObject() throws Exception { - return new SubscriptionWebsocketHandlerDstu3(); - } - - @Override - public Class getObjectType() { - return ISubscriptionWebsocketHandler.class; - } - - @Override - public boolean isSingleton() { - return false; - } -} diff --git a/hapi-fhir-structures-dstu/src/test/java/ca/uhn/fhir/rest/server/exceptions/ExceptionPropertiesTest.java b/hapi-fhir-structures-dstu/src/test/java/ca/uhn/fhir/rest/server/exceptions/ExceptionPropertiesTest.java index b4dab407480..5c8cd54458a 100644 --- a/hapi-fhir-structures-dstu/src/test/java/ca/uhn/fhir/rest/server/exceptions/ExceptionPropertiesTest.java +++ b/hapi-fhir-structures-dstu/src/test/java/ca/uhn/fhir/rest/server/exceptions/ExceptionPropertiesTest.java @@ -10,11 +10,22 @@ import com.google.common.collect.ImmutableSet; import com.google.common.reflect.ClassPath; import com.google.common.reflect.ClassPath.ClassInfo; +import ca.uhn.fhir.model.dstu.resource.OperationOutcome; +import ca.uhn.fhir.rest.client.exceptions.FhirClientConnectionException; import ca.uhn.fhir.util.TestUtil; public class ExceptionPropertiesTest { private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ExceptionPropertiesTest.class); + @Test + public void testConstructors() { + new FhirClientConnectionException(""); + new FhirClientConnectionException("", new Exception()); + new FhirClientConnectionException(new Exception()); + new NotImplementedOperationException(""); + new NotImplementedOperationException(null, new OperationOutcome()); + } + @SuppressWarnings("deprecation") @Test public void testExceptionsAreGood() throws Exception { diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/provider/dstu3/BaseJpaResourceProviderQuestionnaireResponseDstu3.java b/hapi-fhir-structures-dstu3/src/test/java/ca/uhn/fhir/parser/ErrorHandlerAdapterTest.java similarity index 54% rename from hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/provider/dstu3/BaseJpaResourceProviderQuestionnaireResponseDstu3.java rename to hapi-fhir-structures-dstu3/src/test/java/ca/uhn/fhir/parser/ErrorHandlerAdapterTest.java index e7e4f53b5a5..61140664466 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/provider/dstu3/BaseJpaResourceProviderQuestionnaireResponseDstu3.java +++ b/hapi-fhir-structures-dstu3/src/test/java/ca/uhn/fhir/parser/ErrorHandlerAdapterTest.java @@ -1,10 +1,13 @@ -package ca.uhn.fhir.jpa.provider.dstu3; +package ca.uhn.fhir.parser; -import org.hl7.fhir.dstu3.model.QuestionnaireResponse; +import org.junit.Test; + +import ca.uhn.fhir.parser.ErrorHandlerAdapter; +import ca.uhn.fhir.parser.IParserErrorHandler; /* * #%L - * HAPI FHIR JPA Server + * HAPI FHIR - Core Library * %% * Copyright (C) 2014 - 2016 University Health Network * %% @@ -22,8 +25,15 @@ import org.hl7.fhir.dstu3.model.QuestionnaireResponse; * #L% */ -public class BaseJpaResourceProviderQuestionnaireResponseDstu3 extends JpaResourceProviderDstu3 { - - // nothing yet - +/** + * Adapter implementation with NOP implementations of all {@link IParserErrorHandler} methods. + */ +public class ErrorHandlerAdapterTest { + + @Test + public void testMethods() { + new ErrorHandlerAdapter().unexpectedRepeatingElement(null, null); + new ErrorHandlerAdapter().unknownAttribute(null, null); + new ErrorHandlerAdapter().unknownElement(null, null); + } } diff --git a/hapi-fhir-structures-dstu3/src/test/java/ca/uhn/fhir/rest/client/GenericClientDstu3Test.java b/hapi-fhir-structures-dstu3/src/test/java/ca/uhn/fhir/rest/client/GenericClientDstu3Test.java index 47df4e697f9..6736a1fe1a4 100644 --- a/hapi-fhir-structures-dstu3/src/test/java/ca/uhn/fhir/rest/client/GenericClientDstu3Test.java +++ b/hapi-fhir-structures-dstu3/src/test/java/ca/uhn/fhir/rest/client/GenericClientDstu3Test.java @@ -1,6 +1,8 @@ package ca.uhn.fhir.rest.client; import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.either; +import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.startsWith; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; @@ -14,6 +16,7 @@ import static org.mockito.Mockito.when; import java.io.IOException; import java.io.InputStream; import java.io.StringReader; +import java.net.SocketTimeoutException; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Arrays; @@ -49,6 +52,9 @@ import org.mockito.internal.stubbing.defaultanswers.ReturnsDeepStubs; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; +import com.google.common.base.Charsets; +import com.phloc.commons.io.streams.StringInputStream; + import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirVersionEnum; import ca.uhn.fhir.model.api.TemporalPrecisionEnum; @@ -61,10 +67,12 @@ import ca.uhn.fhir.parser.CustomTypeDstu3Test.MyCustomPatient; import ca.uhn.fhir.parser.IParser; import ca.uhn.fhir.rest.api.MethodOutcome; import ca.uhn.fhir.rest.api.PreferReturnEnum; +import ca.uhn.fhir.rest.client.exceptions.FhirClientConnectionException; import ca.uhn.fhir.rest.client.interceptor.CookieInterceptor; import ca.uhn.fhir.rest.client.interceptor.UserInfoInterceptor; import ca.uhn.fhir.rest.param.ParamPrefixEnum; import ca.uhn.fhir.rest.server.Constants; +import ca.uhn.fhir.rest.server.exceptions.NotImplementedOperationException; import ca.uhn.fhir.util.TestUtil; import ca.uhn.fhir.util.UrlUtil; import ca.uhn.fhir.util.VersionUtil; @@ -83,7 +91,7 @@ public class GenericClientDstu3Test { ourCtx.getRestfulClientFactory().setServerValidationMode(ServerValidationModeEnum.NEVER); myHttpResponse = mock(HttpResponse.class, new ReturnsDeepStubs()); myAnswerCount = 0; - + System.setProperty(BaseClient.HAPI_CLIENT_KEEPRESPONSES, "true"); } @@ -113,7 +121,84 @@ public class GenericClientDstu3Test { assertEquals("Must call fetchConformance() instead of conformance() for RI/STU3+ structures", e.getMessage()); } } - + + @Test + public void testReadWithUnparseableResponse() throws Exception { + String msg = "{\"resourceTypeeeee\":\"Patient\"}"; + + ArgumentCaptor capt = ArgumentCaptor.forClass(HttpUriRequest.class); + when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse); + when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK")); + when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_JSON + "; charset=UTF-8")); + when(myHttpResponse.getEntity().getContent()).thenReturn(new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8"))); + + IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir"); + + try { + client.read().resource("Patient").withId("123").elementsSubset("name", "identifier").execute(); + fail(); + } catch (FhirClientConnectionException e) { + assertEquals("Failed to parse response from server when performing GET to URL http://example.com/fhir/Patient/123?_elements=identifier%2Cname - ca.uhn.fhir.parser.DataFormatException: Invalid JSON content detected, missing required element: 'resourceType'", e.getMessage()); + } + } + + @Test + public void testHttp501() throws Exception { + ArgumentCaptor capt = ArgumentCaptor.forClass(HttpUriRequest.class); + when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse); + when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 501, "Not Implemented")); + when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8")); + when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer() { + @Override + public StringInputStream answer(InvocationOnMock theInvocation) throws Throwable { + return new StringInputStream("not implemented", Charsets.UTF_8); + } + }); + + IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir"); + + try { + client.read().resource(Patient.class).withId("1").execute(); + fail(); + } catch (NotImplementedOperationException e) { + assertEquals("HTTP 501 Not Implemented", e.getMessage()); + } + + } + + @SuppressWarnings("unchecked") + @Test + public void testClientFailures() throws Exception { + ArgumentCaptor capt = ArgumentCaptor.forClass(HttpUriRequest.class); + when(myHttpClient.execute(capt.capture())).thenReturn(myHttpResponse); + when(myHttpResponse.getStatusLine()).thenReturn(new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), 200, "OK")); + when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8")); + when(myHttpResponse.getEntity().getContent()).thenThrow(IllegalStateException.class, RuntimeException.class, Exception.class); + + IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir"); + + try { + client.read().resource(Patient.class).withId("1").execute(); + fail(); + } catch (FhirClientConnectionException e) { + assertEquals("java.lang.IllegalStateException", e.getMessage()); + } + + try { + client.read().resource(Patient.class).withId("1").execute(); + fail(); + } catch (RuntimeException e) { + assertEquals("java.lang.RuntimeException", e.toString()); + } + + try { + client.read().resource(Patient.class).withId("1").execute(); + fail(); + } catch (FhirClientConnectionException e) { + assertEquals("java.lang.Exception", e.getMessage()); + } + } + @Test public void testBinaryCreateWithFhirContentType() throws Exception { IParser p = ourCtx.newXmlParser(); @@ -284,6 +369,7 @@ public class GenericClientDstu3Test { assertEquals(myAnswerCount, capt.getAllValues().size()); assertEquals("http://example.com/fhir/Patient", capt.getAllValues().get(0).getURI().toASCIIString()); } + @Test public void testUserInfoInterceptor() throws Exception { final String respString = CustomTypeDstu3Test.createBundle(CustomTypeDstu3Test.createResource(false)); @@ -338,7 +424,7 @@ public class GenericClientDstu3Test { assertEquals("foo=bar", capt.getAllValues().get(0).getFirstHeader("Cookie").getValue()); } - + @Test public void testExplicitCustomTypeHistoryType() throws Exception { final String respString = CustomTypeDstu3Test.createBundle(CustomTypeDstu3Test.createResource(false)); @@ -592,7 +678,7 @@ public class GenericClientDstu3Test { when(myHttpResponse.getAllHeaders()).thenAnswer(new Answer() { @Override public Header[] answer(InvocationOnMock theInvocation) throws Throwable { - return new Header[] { }; + return new Header[] {}; } }); when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8")); @@ -659,7 +745,6 @@ public class GenericClientDstu3Test { assertEquals("http://example.com/fhir/Patient/222", capt.getAllValues().get(0).getURI().toASCIIString()); } - @Test public void testSearchForUnknownType() throws Exception { IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir"); @@ -670,8 +755,7 @@ public class GenericClientDstu3Test { assertEquals("Unable to determine the resource type from the given URI: ?aaaa", e.getMessage()); } } - - + @Test public void testUserAgentForBinary() throws Exception { IParser p = ourCtx.newXmlParser(); @@ -733,7 +817,7 @@ public class GenericClientDstu3Test { IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir"); int idx = 0; - + //@formatter:off client .search() @@ -805,6 +889,7 @@ public class GenericClientDstu3Test { when(myHttpResponse.getEntity().getContentType()).thenReturn(new BasicHeader("content-type", Constants.CT_FHIR_XML + "; charset=UTF-8")); when(myHttpResponse.getEntity().getContent()).thenAnswer(new Answer() { private int myCount = 0; + @Override public ReaderInputStream answer(InvocationOnMock theInvocation) throws Throwable { final String respString; @@ -827,11 +912,11 @@ public class GenericClientDstu3Test { assertEquals(2, capt.getAllValues().size()); assertEquals("http://testForceConformance.com/fhir/metadata", capt.getAllValues().get(0).getURI().toASCIIString()); assertEquals("http://testForceConformance.com/fhir/Patient/1", capt.getAllValues().get(1).getURI().toASCIIString()); - + client.read().resource("Patient").withId("1").execute(); assertEquals(3, capt.getAllValues().size()); assertEquals("http://testForceConformance.com/fhir/Patient/1", capt.getAllValues().get(2).getURI().toASCIIString()); - + client.forceConformanceCheck(); assertEquals(4, capt.getAllValues().size()); assertEquals("http://testForceConformance.com/fhir/metadata", capt.getAllValues().get(3).getURI().toASCIIString()); @@ -857,7 +942,7 @@ public class GenericClientDstu3Test { public static void beforeClass() { ourCtx = FhirContext.forDstu3(); } - + @SuppressWarnings("deprecation") @Test public void testSearchByQuantity() throws Exception { @@ -871,11 +956,12 @@ public class GenericClientDstu3Test { @Override public InputStream answer(InvocationOnMock theInvocation) throws Throwable { return new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8")); - }}); + } + }); IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir"); int idx = 0; - + //@formatter:off client.search() .forResource("Observation") @@ -1010,11 +1096,12 @@ public class GenericClientDstu3Test { @Override public InputStream answer(InvocationOnMock theInvocation) throws Throwable { return new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8")); - }}); + } + }); IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir"); int idx = 0; - + //@formatter:off client.search() .forResource("Device") @@ -1038,7 +1125,6 @@ public class GenericClientDstu3Test { } - @Test public void testSearchByString() throws Exception { final String msg = "{\"resourceType\":\"Bundle\",\"id\":null,\"base\":\"http://localhost:57931/fhir/contextDev\",\"total\":1,\"link\":[{\"relation\":\"self\",\"url\":\"http://localhost:57931/fhir/contextDev/Patient?identifier=urn%3AMultiFhirVersionTest%7CtestSubmitPatient01&_format=json\"}],\"entry\":[{\"resource\":{\"resourceType\":\"Patient\",\"id\":\"1\",\"meta\":{\"versionId\":\"1\",\"lastUpdated\":\"2014-12-20T18:41:29.706-05:00\"},\"identifier\":[{\"system\":\"urn:MultiFhirVersionTest\",\"value\":\"testSubmitPatient01\"}]}}]}"; @@ -1051,11 +1137,12 @@ public class GenericClientDstu3Test { @Override public InputStream answer(InvocationOnMock theInvocation) throws Throwable { return new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8")); - }}); + } + }); IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir"); int idx = 0; - + //@formatter:off client.search() .forResource("Patient") @@ -1095,9 +1182,7 @@ public class GenericClientDstu3Test { //@formatter:on assertEquals("http://example.com/fhir/Patient?name=AAA,BBB", UrlUtil.unescape(capt.getAllValues().get(idx).getURI().toString())); idx++; - - - + //@formatter:off client.search() .forResource("Patient") @@ -1152,13 +1237,14 @@ public class GenericClientDstu3Test { @Override public InputStream answer(InvocationOnMock theInvocation) throws Throwable { return new ReaderInputStream(new StringReader(msg), Charset.forName("UTF-8")); - }}); + } + }); IGenericClient client = ourCtx.newRestfulGenericClient("http://example.com/fhir"); int idx = 0; - + Date date = new DateTimeDt("2011-01-02T22:33:01Z").getValue(); - + //@formatter:off client.search() .forResource("Patient") @@ -1230,7 +1316,7 @@ public class GenericClientDstu3Test { idx++; String expDate = new DateTimeDt(date).getValueAsString(); - + //@formatter:off client.search() .forResource("Patient") diff --git a/hapi-fhir-structures-dstu3/src/test/java/ca/uhn/fhir/rest/server/SearchWithServerAddressStrategyDstu3Test.java b/hapi-fhir-structures-dstu3/src/test/java/ca/uhn/fhir/rest/server/SearchWithServerAddressStrategyDstu3Test.java index 613c80134e9..37171de83ee 100644 --- a/hapi-fhir-structures-dstu3/src/test/java/ca/uhn/fhir/rest/server/SearchWithServerAddressStrategyDstu3Test.java +++ b/hapi-fhir-structures-dstu3/src/test/java/ca/uhn/fhir/rest/server/SearchWithServerAddressStrategyDstu3Test.java @@ -21,14 +21,11 @@ import org.hl7.fhir.dstu3.model.HumanName; import org.hl7.fhir.dstu3.model.Patient; import org.hl7.fhir.instance.model.api.IBaseResource; import org.junit.AfterClass; -import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import ca.uhn.fhir.context.FhirContext; -import ca.uhn.fhir.rest.annotation.RequiredParam; import ca.uhn.fhir.rest.annotation.Search; -import ca.uhn.fhir.rest.param.TokenParam; import ca.uhn.fhir.util.PortUtil; import ca.uhn.fhir.util.TestUtil; @@ -55,6 +52,55 @@ public class SearchWithServerAddressStrategyDstu3Test { assertThat(responseContent, containsString("")); } + @Test + public void testApacheProxyAddressStrategy() throws Exception { + + ourServlet.setServerAddressStrategy(ApacheProxyAddressStrategy.forHttp()); + HttpGet httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient"); + HttpResponse status = ourClient.execute(httpGet); + String responseContent = IOUtils.toString(status.getEntity().getContent()); + IOUtils.closeQuietly(status.getEntity().getContent()); + ourLog.info(responseContent); + assertEquals(200, status.getStatusLine().getStatusCode()); + assertThat(responseContent, containsString("")); + + ourServlet.setServerAddressStrategy(new ApacheProxyAddressStrategy(false)); + httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient"); + httpGet.addHeader("x-forwarded-host", "foo.com"); + status = ourClient.execute(httpGet); + responseContent = IOUtils.toString(status.getEntity().getContent()); + IOUtils.closeQuietly(status.getEntity().getContent()); + ourLog.info(responseContent); + assertEquals(200, status.getStatusLine().getStatusCode()); + assertThat(responseContent, containsString("")); + + ourServlet.setServerAddressStrategy(ApacheProxyAddressStrategy.forHttps()); + httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient"); + httpGet.addHeader("x-forwarded-host", "foo.com"); + status = ourClient.execute(httpGet); + responseContent = IOUtils.toString(status.getEntity().getContent()); + IOUtils.closeQuietly(status.getEntity().getContent()); + ourLog.info(responseContent); + assertEquals(200, status.getStatusLine().getStatusCode()); + assertThat(responseContent, containsString("")); + + ourServlet.setServerAddressStrategy(new ApacheProxyAddressStrategy(false)); + httpGet = new HttpGet("http://localhost:" + ourPort + "/Patient"); + httpGet.addHeader("x-forwarded-host", "foo.com"); + httpGet.addHeader("x-forwarded-proto", "https"); + status = ourClient.execute(httpGet); + responseContent = IOUtils.toString(status.getEntity().getContent()); + IOUtils.closeQuietly(status.getEntity().getContent()); + ourLog.info(responseContent); + assertEquals(200, status.getStatusLine().getStatusCode()); + assertThat(responseContent, containsString("")); + + } + @Test public void testHardcodedAddressStrategy() throws Exception { ourServlet.setServerAddressStrategy(new HardcodedServerAddressStrategy("http://example.com/fhir/base"));