From 1695568c757635ee27a8d59255eb6354aacce54d Mon Sep 17 00:00:00 2001 From: Sanjay Dalal Date: Tue, 16 Feb 2010 21:24:44 +0000 Subject: [PATCH] CSPACE-1016 service tests can now be run with auth test: all service tests (except id) with and without auth. id service tests fail locally due to a classpath issue (not able to find jdbc driver) If the auth mode is disabled, you would see the following emitted from AbstractServiceClientImpl during construction INFO main org.collectionspace.services.client.AbstractServiceClientImpl:191 setupHttpClient() : no auth mode! Required system properties to run the tests with authentication enabled are 1. cspace.auth to true, indicates to use HTTP authentication. We will use BASIC authentication in these tests. 2. cspace.user indicates user name to use 3. cspace.password indicates password to use (clear text ... this is only a test) 4. cspace.server.secure true, indicates that services layer is enabled for security. Some tests still use this property. This was added because web.xml changes were required to enable security on the server side. With Spring security, it is no more needed on the server side. However, some client side tests (account, security, collecitonobject, relation) would still look for it. command line would be mvn -Dcspace.server.secure=true -DforkMode=never -Dcspace.auth=true -Dcspace.user=test -Dcspace.password=test test Note that forkMode=never is required to pass properties to the JVM. Without that property, maven may start a new process to run the test and would not pass the required properties. _M trunk/services/PerformanceTests M trunk/services/dimension/client/src/main/java/org/collectionspace/services/client/DimensionClient.java M trunk/services/acquisition/client/src/main/java/org/collectionspace/services/client/AcquisitionClient.java M trunk/services/contact/client/src/main/java/org/collectionspace/services/client/ContactClient.java _M trunk/services/account/pstore M trunk/services/organization/client/src/main/java/org/collectionspace/services/client/OrgAuthorityClient.java M trunk/services/person/client/src/main/java/org/collectionspace/services/client/PersonAuthorityClient.java M trunk/services/intake/client/src/main/java/org/collectionspace/services/client/IntakeClient.java M trunk/services/client/src/test/java/org/collectionspace/services/client/test/ServiceLayerTest.java M trunk/services/client/src/main/java/org/collectionspace/services/client/AbstractServiceClientImpl.java --- .../services/client/AcquisitionClient.java | 30 +++-- .../client/AbstractServiceClientImpl.java | 12 +- .../client/test/ServiceLayerTest.java | 112 +++++++++--------- .../services/client/ContactClient.java | 16 ++- .../services/client/DimensionClient.java | 15 ++- .../services/client/IntakeClient.java | 33 ++++-- .../services/client/OrgAuthorityClient.java | 37 +++--- .../client/PersonAuthorityClient.java | 41 ++++--- 8 files changed, 184 insertions(+), 112 deletions(-) diff --git a/services/acquisition/client/src/main/java/org/collectionspace/services/client/AcquisitionClient.java b/services/acquisition/client/src/main/java/org/collectionspace/services/client/AcquisitionClient.java index 5c98b8b92..954d0eedb 100644 --- a/services/acquisition/client/src/main/java/org/collectionspace/services/client/AcquisitionClient.java +++ b/services/acquisition/client/src/main/java/org/collectionspace/services/client/AcquisitionClient.java @@ -18,14 +18,13 @@ import org.jboss.resteasy.spi.ResteasyProviderFactory; */ public class AcquisitionClient extends AbstractServiceClientImpl { - /* (non-Javadoc) - * @see org.collectionspace.services.client.BaseServiceClient#getServicePathComponent() - */ - public String getServicePathComponent() { - return "acquisitions"; - } - - // FIXME: Is the "instance" member still needed/used? + /* (non-Javadoc) + * @see org.collectionspace.services.client.BaseServiceClient#getServicePathComponent() + */ + public String getServicePathComponent() { + return "acquisitions"; + } + // FIXME: Is the "instance" member still needed/used? /** * */ @@ -43,7 +42,20 @@ public class AcquisitionClient extends AbstractServiceClientImpl { public AcquisitionClient() { ResteasyProviderFactory factory = ResteasyProviderFactory.getInstance(); RegisterBuiltin.register(factory); - acquisitionProxy = ProxyFactory.create(AcquisitionProxy.class, getBaseURL()); + setProxy(); + } + + /** + * allow to reset proxy as per security needs + */ + public void setProxy() { + if (useAuth()) { + acquisitionProxy = ProxyFactory.create(AcquisitionProxy.class, + getBaseURL(), getHttpClient()); + } else { + acquisitionProxy = ProxyFactory.create(AcquisitionProxy.class, + getBaseURL()); + } } /** diff --git a/services/client/src/main/java/org/collectionspace/services/client/AbstractServiceClientImpl.java b/services/client/src/main/java/org/collectionspace/services/client/AbstractServiceClientImpl.java index aef848a5c..8e02da3da 100644 --- a/services/client/src/main/java/org/collectionspace/services/client/AbstractServiceClientImpl.java +++ b/services/client/src/main/java/org/collectionspace/services/client/AbstractServiceClientImpl.java @@ -173,8 +173,8 @@ public abstract class AbstractServiceClientImpl implements CollectionSpaceClient if(useAuth()){ String user = properties.getProperty(USER_PROPERTY); String password = properties.getProperty(PASSWORD_PROPERTY); - if(logger.isDebugEnabled()){ - logger.debug("setupHttpClient() using url=" + url + + if(logger.isInfoEnabled()){ + logger.info("setupHttpClient() using url=" + url + " user=" + user + " password=" + password); } @@ -183,8 +183,12 @@ public abstract class AbstractServiceClientImpl implements CollectionSpaceClient new UsernamePasswordCredentials(user, password)); //JAXRS client library requires HTTP preemptive authentication httpClient.getParams().setAuthenticationPreemptive(true); - if(logger.isDebugEnabled()){ - logger.debug("setupHttpClient: set preemptive authentication"); + if(logger.isInfoEnabled()){ + logger.info("setupHttpClient: set preemptive authentication"); + } + } else { + if(logger.isInfoEnabled()){ + logger.info("setupHttpClient() : no auth mode!"); } } } diff --git a/services/client/src/test/java/org/collectionspace/services/client/test/ServiceLayerTest.java b/services/client/src/test/java/org/collectionspace/services/client/test/ServiceLayerTest.java index 61fcbe99a..4aa420951 100644 --- a/services/client/src/test/java/org/collectionspace/services/client/test/ServiceLayerTest.java +++ b/services/client/src/test/java/org/collectionspace/services/client/test/ServiceLayerTest.java @@ -53,20 +53,21 @@ public class ServiceLayerTest { private TestServiceClient serviceClient = new TestServiceClient(); private HttpClient httpClient = serviceClient.getHttpClient(); - @BeforeSuite void printServiceClientProperties() { - if(logger.isDebugEnabled()){ + @BeforeSuite + void printServiceClientProperties() { + if (logger.isDebugEnabled()) { logger.debug("Client properties read from the properties path;\n" - +"possibly from the command line or a properties file:"); - logger.debug("url = " + - serviceClient.getProperty(serviceClient.URL_PROPERTY)); - logger.debug("secure (SSL) = " + - serviceClient.getProperty(serviceClient.SSL_PROPERTY)); - logger.debug("useAuth = " + - serviceClient.getProperty(serviceClient.AUTH_PROPERTY)); - logger.debug("user = " + - serviceClient.getProperty(serviceClient.USER_PROPERTY)); - logger.debug("password = " + - serviceClient.getProperty(serviceClient.PASSWORD_PROPERTY)); + + "possibly from the command line or a properties file:"); + logger.debug("url = " + + serviceClient.getProperty(serviceClient.URL_PROPERTY)); + logger.debug("secure (SSL) = " + + serviceClient.getProperty(serviceClient.SSL_PROPERTY)); + logger.debug("useAuth = " + + serviceClient.getProperty(serviceClient.AUTH_PROPERTY)); + logger.debug("user = " + + serviceClient.getProperty(serviceClient.USER_PROPERTY)); + logger.debug("password = " + + serviceClient.getProperty(serviceClient.PASSWORD_PROPERTY)); } } @@ -75,21 +76,21 @@ public class ServiceLayerTest { //use ID service that should always be present in a working service layer String url = serviceClient.getBaseURL() + "idgenerators"; OptionsMethod method = new OptionsMethod(url); - try{ + try { serviceClient = new TestServiceClient(); int statusCode = httpClient.executeMethod(method); - if(logger.isDebugEnabled()){ + if (logger.isDebugEnabled()) { logger.debug("servicesExist url=" + url + " status=" + statusCode); } Assert.assertEquals(statusCode, HttpStatus.SC_OK, "expected " + HttpStatus.SC_OK); - }catch(HttpException e){ + } catch (HttpException e) { logger.error("Fatal protocol violation: ", e); - }catch(IOException e){ + } catch (IOException e) { logger.error("Fatal transport error", e); - }catch(Exception e){ + } catch (Exception e) { logger.error("unknown exception ", e); - }finally{ + } finally { // Release the connection. method.releaseConnection(); } @@ -100,20 +101,20 @@ public class ServiceLayerTest { // Delete is not allowed on the root URL of the id service String url = serviceClient.getBaseURL() + "idgenerators"; DeleteMethod method = new DeleteMethod(url); - try{ + try { int statusCode = httpClient.executeMethod(method); - if(logger.isDebugEnabled()){ + if (logger.isDebugEnabled()) { logger.debug(" methodNotAllowed url=" + url + " status=" + statusCode); } Assert.assertEquals(statusCode, HttpStatus.SC_METHOD_NOT_ALLOWED, "expected " + HttpStatus.SC_METHOD_NOT_ALLOWED); - }catch(HttpException e){ + } catch (HttpException e) { logger.error("Fatal protocol violation: ", e); - }catch(IOException e){ + } catch (IOException e) { logger.error("Fatal transport error", e); - }catch(Exception e){ + } catch (Exception e) { logger.error("unknown exception ", e); - }finally{ + } finally { // Release the connection. method.releaseConnection(); } @@ -123,20 +124,20 @@ public class ServiceLayerTest { public void nonexistentService() { String url = serviceClient.getBaseURL() + "nonexistent-service"; GetMethod method = new GetMethod(url); - try{ + try { int statusCode = httpClient.executeMethod(method); - if(logger.isDebugEnabled()){ + if (logger.isDebugEnabled()) { logger.debug("nonexistentService url=" + url + " status=" + statusCode); } Assert.assertEquals(statusCode, HttpStatus.SC_NOT_FOUND, "expected " + HttpStatus.SC_NOT_FOUND); - }catch(HttpException e){ + } catch (HttpException e) { logger.error("Fatal protocol violation: ", e); - }catch(IOException e){ + } catch (IOException e) { logger.error("Fatal transport error", e); - }catch(Exception e){ + } catch (Exception e) { logger.error("unknown exception ", e); - }finally{ + } finally { // Release the connection. method.releaseConnection(); } @@ -144,7 +145,7 @@ public class ServiceLayerTest { @Test public void serviceSecure() { - if(!serviceClient.isServerSecure()){ + if (!serviceClient.isServerSecure()) { logger.warn("set -Dcspace.server.secure=true to run security tests"); return; } @@ -153,20 +154,23 @@ public class ServiceLayerTest { // This vanilla HTTP client does not contain credentials or any other // properties of the serviceClient. HttpClient noCredentialsHttpClient = new HttpClient(); - try{ + try { int statusCode = noCredentialsHttpClient.executeMethod(method); - if(logger.isDebugEnabled()){ + if (logger.isDebugEnabled()) { logger.debug("serviceSecure url=" + url + " status=" + statusCode); } - Assert.assertEquals(statusCode, HttpStatus.SC_UNAUTHORIZED, - "expected " + HttpStatus.SC_UNAUTHORIZED); - }catch(HttpException e){ + //due to anonymous support, the service returns 200 instead of 401 +// Assert.assertEquals(statusCode, HttpStatus.SC_UNAUTHORIZED, +// "expected " + HttpStatus.SC_UNAUTHORIZED); + Assert.assertEquals(statusCode, HttpStatus.SC_OK, + "expected " + HttpStatus.SC_OK); + } catch (HttpException e) { logger.error("Fatal protocol violation: ", e); - }catch(IOException e){ + } catch (IOException e) { logger.error("Fatal transport error", e); - }catch(Exception e){ + } catch (Exception e) { logger.error("unknown exception ", e); - }finally{ + } finally { // Release the connection. method.releaseConnection(); } @@ -176,25 +180,25 @@ public class ServiceLayerTest { public void traceSupported() { String url = serviceClient.getBaseURL() + "collectionobjects"; TraceMethod method = new TraceMethod(url); - try{ + try { int statusCode = httpClient.executeMethod(method); - if(logger.isDebugEnabled()){ + if (logger.isDebugEnabled()) { logger.debug("traceSupported url=" + url + " status=" + statusCode); logger.debug("traceSupported response=" + new String(method.getResponseBody())); - for(Header h : method.getResponseHeaders()){ + for (Header h : method.getResponseHeaders()) { logger.debug("traceSupported header name=" + h.getName() + " value=" + h.getValue()); } } Assert.assertEquals(statusCode, HttpStatus.SC_METHOD_NOT_ALLOWED, "expected " + HttpStatus.SC_METHOD_NOT_ALLOWED); - }catch(HttpException e){ + } catch (HttpException e) { logger.error("Fatal protocol violation: ", e); - }catch(IOException e){ + } catch (IOException e) { logger.error("Fatal transport error", e); - }catch(Exception e){ + } catch (Exception e) { logger.error("unknown exception ", e); - }finally{ + } finally { // Release the connection. method.releaseConnection(); } @@ -204,24 +208,24 @@ public class ServiceLayerTest { public void headSupported() { String url = serviceClient.getBaseURL() + "intakes"; HeadMethod method = new HeadMethod(url); - try{ + try { int statusCode = httpClient.executeMethod(method); Assert.assertEquals(method.getResponseBody(), null, "expected null"); - if(logger.isDebugEnabled()){ + if (logger.isDebugEnabled()) { logger.debug("headSupported url=" + url + " status=" + statusCode); - for(Header h : method.getResponseHeaders()){ + for (Header h : method.getResponseHeaders()) { logger.debug("headSupported header name=" + h.getName() + " value=" + h.getValue()); } } Assert.assertEquals(statusCode, HttpStatus.SC_OK, "expected " + HttpStatus.SC_OK); - }catch(HttpException e){ + } catch (HttpException e) { logger.error("Fatal protocol violation: ", e); - }catch(IOException e){ + } catch (IOException e) { logger.error("Fatal transport error", e); - }catch(Exception e){ + } catch (Exception e) { logger.error("unknown exception ", e); - }finally{ + } finally { // Release the connection. method.releaseConnection(); } diff --git a/services/contact/client/src/main/java/org/collectionspace/services/client/ContactClient.java b/services/contact/client/src/main/java/org/collectionspace/services/client/ContactClient.java index 5171d3d88..dadcbad2d 100644 --- a/services/contact/client/src/main/java/org/collectionspace/services/client/ContactClient.java +++ b/services/contact/client/src/main/java/org/collectionspace/services/client/ContactClient.java @@ -18,7 +18,6 @@ package org.collectionspace.services.client; import javax.ws.rs.core.Response; -import org.collectionspace.services.common.context.ServiceContext; import org.collectionspace.services.contact.ContactsCommonList; import org.jboss.resteasy.client.ProxyFactory; @@ -62,7 +61,20 @@ public class ContactClient extends AbstractServiceClientImpl { public ContactClient() { ResteasyProviderFactory factory = ResteasyProviderFactory.getInstance(); RegisterBuiltin.register(factory); - contactProxy = ProxyFactory.create(ContactProxy.class, getBaseURL()); + setProxy(); + } + + /** + * allow to reset proxy as per security needs + */ + public void setProxy() { + if (useAuth()) { + contactProxy = ProxyFactory.create(ContactProxy.class, + getBaseURL(), getHttpClient()); + } else { + contactProxy = ProxyFactory.create(ContactProxy.class, + getBaseURL()); + } } /** diff --git a/services/dimension/client/src/main/java/org/collectionspace/services/client/DimensionClient.java b/services/dimension/client/src/main/java/org/collectionspace/services/client/DimensionClient.java index af3cd48e9..fd31a2d0d 100644 --- a/services/dimension/client/src/main/java/org/collectionspace/services/client/DimensionClient.java +++ b/services/dimension/client/src/main/java/org/collectionspace/services/client/DimensionClient.java @@ -70,7 +70,20 @@ public class DimensionClient extends AbstractServiceClientImpl { public DimensionClient() { ResteasyProviderFactory factory = ResteasyProviderFactory.getInstance(); RegisterBuiltin.register(factory); - dimensionProxy = ProxyFactory.create(DimensionProxy.class, getBaseURL()); + setProxy(); + } + + /** + * allow to reset proxy as per security needs + */ + public void setProxy() { + if (useAuth()) { + dimensionProxy = ProxyFactory.create(DimensionProxy.class, + getBaseURL(), getHttpClient()); + } else { + dimensionProxy = ProxyFactory.create(DimensionProxy.class, + getBaseURL()); + } } /** diff --git a/services/intake/client/src/main/java/org/collectionspace/services/client/IntakeClient.java b/services/intake/client/src/main/java/org/collectionspace/services/client/IntakeClient.java index 5a86a8fff..860206680 100644 --- a/services/intake/client/src/main/java/org/collectionspace/services/client/IntakeClient.java +++ b/services/intake/client/src/main/java/org/collectionspace/services/client/IntakeClient.java @@ -28,7 +28,6 @@ package org.collectionspace.services.client; import javax.ws.rs.core.Response; -import org.collectionspace.services.common.context.ServiceContext; import org.collectionspace.services.intake.IntakesCommonList; import org.jboss.resteasy.client.ProxyFactory; @@ -45,18 +44,16 @@ import org.jboss.resteasy.spi.ResteasyProviderFactory; */ public class IntakeClient extends AbstractServiceClientImpl { - /* (non-Javadoc) - * @see org.collectionspace.services.client.AbstractServiceClientImpl#getServicePathComponent() - */ - public String getServicePathComponent() { - return "intakes"; - } - - /** + /* (non-Javadoc) + * @see org.collectionspace.services.client.AbstractServiceClientImpl#getServicePathComponent() + */ + public String getServicePathComponent() { + return "intakes"; + } + /** * */ private static final IntakeClient instance = new IntakeClient(); - /** * */ @@ -70,7 +67,20 @@ public class IntakeClient extends AbstractServiceClientImpl { public IntakeClient() { ResteasyProviderFactory factory = ResteasyProviderFactory.getInstance(); RegisterBuiltin.register(factory); - intakeProxy = ProxyFactory.create(IntakeProxy.class, getBaseURL()); + setProxy(); + } + + /** + * allow to reset proxy as per security needs + */ + public void setProxy() { + if (useAuth()) { + intakeProxy = ProxyFactory.create(IntakeProxy.class, + getBaseURL(), getHttpClient()); + } else { + intakeProxy = ProxyFactory.create(IntakeProxy.class, + getBaseURL()); + } } /** @@ -95,7 +105,6 @@ public class IntakeClient extends AbstractServiceClientImpl { * @return * @see org.collectionspace.hello.client.IntakeProxy#getIntake(java.lang.String) */ - public ClientResponse read(String csid) { return intakeProxy.read(csid); } diff --git a/services/organization/client/src/main/java/org/collectionspace/services/client/OrgAuthorityClient.java b/services/organization/client/src/main/java/org/collectionspace/services/client/OrgAuthorityClient.java index 6555e3e4b..225bc959f 100644 --- a/services/organization/client/src/main/java/org/collectionspace/services/client/OrgAuthorityClient.java +++ b/services/organization/client/src/main/java/org/collectionspace/services/client/OrgAuthorityClient.java @@ -4,7 +4,6 @@ import javax.ws.rs.core.Response; import org.collectionspace.services.organization.OrgauthoritiesCommonList; import org.collectionspace.services.organization.OrganizationsCommonList; -import org.collectionspace.services.client.OrgAuthorityProxy; import org.jboss.resteasy.client.ClientResponse; import org.jboss.resteasy.client.ProxyFactory; @@ -20,18 +19,17 @@ import org.jboss.resteasy.spi.ResteasyProviderFactory; */ public class OrgAuthorityClient extends AbstractServiceClientImpl { - /* (non-Javadoc) - * @see org.collectionspace.services.client.AbstractServiceClientImpl#getServicePathComponent() - */ + /* (non-Javadoc) + * @see org.collectionspace.services.client.AbstractServiceClientImpl#getServicePathComponent() + */ @Override - public String getServicePathComponent() { - return "orgauthorities"; - } - - public String getItemCommonPartName() { - return getCommonPartName("organizations"); - } + public String getServicePathComponent() { + return "orgauthorities"; + } + public String getItemCommonPartName() { + return getCommonPartName("organizations"); + } /** * */ @@ -49,7 +47,20 @@ public class OrgAuthorityClient extends AbstractServiceClientImpl { public OrgAuthorityClient() { ResteasyProviderFactory factory = ResteasyProviderFactory.getInstance(); RegisterBuiltin.register(factory); - orgAuthorityProxy = ProxyFactory.create(OrgAuthorityProxy.class, getBaseURL()); + setProxy(); + } + + /** + * allow to reset proxy as per security needs + */ + public void setProxy() { + if (useAuth()) { + orgAuthorityProxy = ProxyFactory.create(OrgAuthorityProxy.class, + getBaseURL(), getHttpClient()); + } else { + orgAuthorityProxy = ProxyFactory.create(OrgAuthorityProxy.class, + getBaseURL()); + } } /** @@ -74,7 +85,6 @@ public class OrgAuthorityClient extends AbstractServiceClientImpl { * @return * @see org.collectionspace.services.client.OrgAuthorityProxy#read(java.lang.String) */ - public ClientResponse read(String csid) { return orgAuthorityProxy.read(csid); } @@ -121,7 +131,6 @@ public class OrgAuthorityClient extends AbstractServiceClientImpl { * @return * @see org.collectionspace.services.client.OrgAuthorityProxy#read(java.lang.String) */ - public ClientResponse readItem(String vcsid, String csid) { return orgAuthorityProxy.readItem(vcsid, csid); } diff --git a/services/person/client/src/main/java/org/collectionspace/services/client/PersonAuthorityClient.java b/services/person/client/src/main/java/org/collectionspace/services/client/PersonAuthorityClient.java index e9420e606..aa1beb02e 100644 --- a/services/person/client/src/main/java/org/collectionspace/services/client/PersonAuthorityClient.java +++ b/services/person/client/src/main/java/org/collectionspace/services/client/PersonAuthorityClient.java @@ -20,18 +20,17 @@ import org.jboss.resteasy.spi.ResteasyProviderFactory; */ public class PersonAuthorityClient extends AbstractServiceClientImpl { - /* (non-Javadoc) - * @see org.collectionspace.services.client.BaseServiceClient#getServicePathComponent() - */ + /* (non-Javadoc) + * @see org.collectionspace.services.client.BaseServiceClient#getServicePathComponent() + */ @Override - public String getServicePathComponent() { - return "personauthorities"; - } - - public String getItemCommonPartName() { - return getCommonPartName("persons"); - } + public String getServicePathComponent() { + return "personauthorities"; + } + public String getItemCommonPartName() { + return getCommonPartName("persons"); + } /** * */ @@ -49,7 +48,20 @@ public class PersonAuthorityClient extends AbstractServiceClientImpl { public PersonAuthorityClient() { ResteasyProviderFactory factory = ResteasyProviderFactory.getInstance(); RegisterBuiltin.register(factory); - personAuthorityProxy = ProxyFactory.create(PersonAuthorityProxy.class, getBaseURL()); + setProxy(); + } + + /** + * allow to reset proxy as per security needs + */ + public void setProxy() { + if (useAuth()) { + personAuthorityProxy = ProxyFactory.create(PersonAuthorityProxy.class, + getBaseURL(), getHttpClient()); + } else { + personAuthorityProxy = ProxyFactory.create(PersonAuthorityProxy.class, + getBaseURL()); + } } /** @@ -74,7 +86,6 @@ public class PersonAuthorityClient extends AbstractServiceClientImpl { * @return * @see org.collectionspace.services.client.PersonAuthorityProxy#read(java.lang.String) */ - public ClientResponse read(String csid) { return personAuthorityProxy.read(csid); } @@ -121,7 +132,6 @@ public class PersonAuthorityClient extends AbstractServiceClientImpl { * @return * @see org.collectionspace.services.client.PersonAuthorityProxy#read(java.lang.String) */ - public ClientResponse readItem(String vcsid, String csid) { return personAuthorityProxy.readItem(vcsid, csid); } @@ -156,13 +166,12 @@ public class PersonAuthorityClient extends AbstractServiceClientImpl { } public ClientResponse createContact(String authorityCsid, - String itemCsid, MultipartOutput multipart) { + String itemCsid, MultipartOutput multipart) { return personAuthorityProxy.createContact(authorityCsid, itemCsid, multipart); } public ClientResponse readContact(String authorityCsid, - String itemCsid, String csid) { + String itemCsid, String csid) { return personAuthorityProxy.readContact(authorityCsid, itemCsid, csid); } - } -- 2.47.3