Author: ilgrosso Date: Thu Feb 21 15:15:45 2013 New Revision: 1448677 URL: http://svn.apache.org/r1448677 Log: [SYNCOPE-319] Some more refinements
Modified: syncope/trunk/common/src/main/java/org/apache/syncope/common/types/SyncopeClientExceptionType.java syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/Resources.java syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/ResourceConnConfPanel.java syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/ConnectorRestClient.java syncope/trunk/core/src/main/java/org/apache/syncope/core/init/ConnectorManager.java syncope/trunk/core/src/main/java/org/apache/syncope/core/propagation/impl/AsyncConnectorFacade.java syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/PolicyController.java syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/utils/RestServiceExceptionMapper.java syncope/trunk/core/src/main/java/org/apache/syncope/core/util/ConnIdBundleManager.java syncope/trunk/core/src/main/webapp/syncopeClientError.jsp Modified: syncope/trunk/common/src/main/java/org/apache/syncope/common/types/SyncopeClientExceptionType.java URL: http://svn.apache.org/viewvc/syncope/trunk/common/src/main/java/org/apache/syncope/common/types/SyncopeClientExceptionType.java?rev=1448677&r1=1448676&r2=1448677&view=diff ============================================================================== --- syncope/trunk/common/src/main/java/org/apache/syncope/common/types/SyncopeClientExceptionType.java (original) +++ syncope/trunk/common/src/main/java/org/apache/syncope/common/types/SyncopeClientExceptionType.java Thu Feb 21 15:15:45 2013 @@ -29,6 +29,7 @@ public enum SyncopeClientExceptionType { GenericPersistence("Syncope.GenericPersistence", "Syncope.GenericPersistence.cause"), InvalidLogger("Syncope.InvalidLogger", "Syncope.InvalidLogger.message"), InvalidConnInstance("Syncope.InvalidConnInstance", "Syncope.InvalidConnInstance.message"), + InvalidConnIdConf("Syncope.InvalidConnIdConf", "Syncope.InvalidConnIdConf.message"), InvalidPasswordPolicy("Syncope.InvalidPasswordPolicy", "Syncope.InvalidPasswordPolicy.reason"), InvalidAccountPolicy("Syncope.InvalidAccountPolicy", "Syncope.InvalidAccountPolicy.reason"), InvalidSyncPolicy("Syncope.InvalidSyncPolicy", "Syncope.InvalidSyncPolicy.reason"), @@ -38,8 +39,8 @@ public enum SyncopeClientExceptionType { InvalidSchemaDefinition("Syncope.InvalidSchemaDefinition", ""), InvalidSearchCondition("Syncope.InvalidSearchCondition", ""), InvalidPropagationTaskExecReport( - "Syncope.InvalidPropagationTaskExecReport", - "Syncope.InvalidPropagationTaskExecReport.element"), + "Syncope.InvalidPropagationTaskExecReport", + "Syncope.InvalidPropagationTaskExecReport.element"), InvalidUSchema("Syncope.InvalidUSchemaUpdate", "Syncope.InvalidUSchemaUpdate.name"), InvalidUDerSchema("Syncope.InvalidUDerSchemaUpdate", "Syncope.InvalidUDerSchemaUpdate.name"), InvalidUVirSchema("Syncope.InvalidUVirSchemaUpdate", "Syncope.InvalidUVirSchemaUpdate.name"), @@ -70,14 +71,12 @@ public enum SyncopeClientExceptionType { private String elementHeaderName; - private SyncopeClientExceptionType(String headerValue, String elementHeaderName) { - + private SyncopeClientExceptionType(final String headerValue, final String elementHeaderName) { this.headerValue = headerValue; this.elementHeaderName = elementHeaderName; } - public static SyncopeClientExceptionType getFromHeaderValue(String exceptionTypeHeaderValue) { - + public static SyncopeClientExceptionType getFromHeaderValue(final String exceptionTypeHeaderValue) { SyncopeClientExceptionType result = null; for (SyncopeClientExceptionType syncopeClientExceptionType : values()) { if (exceptionTypeHeaderValue.equals(syncopeClientExceptionType.getHeaderValue())) { Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/Resources.java URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/Resources.java?rev=1448677&r1=1448676&r2=1448677&view=diff ============================================================================== --- syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/Resources.java (original) +++ syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/Resources.java Thu Feb 21 15:15:45 2013 @@ -119,6 +119,7 @@ public class Resources extends BasePage error(getString("error") + ": " + e.getMessage()); } target.add(feedbackPanel); + target.add(connectorContainer); } @Override @@ -578,4 +579,4 @@ public class Resources extends BasePage return connectorRestClient.getAllConnectors(); } } -} +} \ No newline at end of file Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/ResourceConnConfPanel.java URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/ResourceConnConfPanel.java?rev=1448677&r1=1448676&r2=1448677&view=diff ============================================================================== --- syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/ResourceConnConfPanel.java (original) +++ syncope/trunk/console/src/main/java/org/apache/syncope/console/pages/panels/ResourceConnConfPanel.java Thu Feb 21 15:15:45 2013 @@ -49,7 +49,6 @@ import org.apache.wicket.markup.html.lis import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; -import org.apache.wicket.model.ResourceModel; import org.apache.wicket.spring.injection.annot.SpringBean; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -87,14 +86,13 @@ public class ResourceConnConfPanel exten private WebMarkupContainer connConfPropContainer; - private AjaxLink check; + private AjaxLink<Void> check; private boolean createFlag; private ResourceTO resourceTO; public ResourceConnConfPanel(final String id, final ResourceTO resourceTO, final boolean createFlag) { - super(id); setOutputMarkupId(true); @@ -107,7 +105,7 @@ public class ResourceConnConfPanel exten connConfPropContainer.setOutputMarkupId(true); add(connConfPropContainer); - check = new IndicatingAjaxLink("check", new ResourceModel("check")) { + check = new IndicatingAjaxLink<Void>("check") { private static final long serialVersionUID = -4199438518229098169L; Modified: syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/ConnectorRestClient.java URL: http://svn.apache.org/viewvc/syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/ConnectorRestClient.java?rev=1448677&r1=1448676&r2=1448677&view=diff ============================================================================== --- syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/ConnectorRestClient.java (original) +++ syncope/trunk/console/src/main/java/org/apache/syncope/console/rest/ConnectorRestClient.java Thu Feb 21 15:15:45 2013 @@ -43,20 +43,16 @@ public class ConnectorRestClient extends private static final long serialVersionUID = -6870366819966266617L; - /** - * Get all connectors. - * - * @return ConnectorInstanceTOs - */ public List<ConnInstanceTO> getAllConnectors() { - return getService(ConnectorService.class).list(SyncopeSession.get().getLocale().toString()); + List<ConnInstanceTO> connectors = Collections.<ConnInstanceTO>emptyList(); + try { + connectors = getService(ConnectorService.class).list(SyncopeSession.get().getLocale().toString()); + } catch (Exception e) { + LOG.error("While reading connectors", e); + } + return connectors; } - /** - * Create new connector. - * - * @param connectorTO - */ public void create(final ConnInstanceTO connectorTO) { connectorTO.setConfiguration(filterProperties(connectorTO.getConfiguration())); getService(ConnectorService.class).create(connectorTO); @@ -164,12 +160,6 @@ public class ConnectorRestClient extends return check; } - /** - * Test resource connection. - * - * @param resourceTO resource - * @return Connection status - */ public boolean check(final ResourceTO resourceTO) { boolean check = false; try { Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/init/ConnectorManager.java URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/init/ConnectorManager.java?rev=1448677&r1=1448676&r2=1448677&view=diff ============================================================================== --- syncope/trunk/core/src/main/java/org/apache/syncope/core/init/ConnectorManager.java (original) +++ syncope/trunk/core/src/main/java/org/apache/syncope/core/init/ConnectorManager.java Thu Feb 21 15:15:45 2013 @@ -18,6 +18,7 @@ */ package org.apache.syncope.core.init; +import java.util.List; import java.util.Locale; import java.util.Set; import org.apache.commons.lang.SerializationUtils; @@ -31,11 +32,12 @@ import org.apache.syncope.core.propagati import org.apache.syncope.core.propagation.impl.ConnectorFacadeProxy; import org.apache.syncope.core.rest.data.ResourceDataBinder; import org.apache.syncope.core.util.ApplicationContextProvider; +import org.apache.syncope.core.util.ConnIdBundleManager; import org.identityconnectors.common.l10n.CurrentLocale; import org.identityconnectors.framework.api.ConnectorFacadeFactory; +import org.identityconnectors.framework.api.ConnectorInfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @@ -59,9 +61,7 @@ class ConnectorManager implements Connec } @Override - public Connector getConnector(final ExternalResource resource) - throws BeansException { - + public Connector getConnector(final ExternalResource resource) { // Try to re-create connector bean from underlying resource (useful for managing failover scenarios) if (!ApplicationContextProvider.getBeanFactory().containsBean(getBeanName(resource))) { registerConnector(resource); @@ -76,8 +76,10 @@ class ConnectorManager implements Connec connInstanceClone.setConfiguration(configuration); - return ApplicationContextProvider.getBeanFactory().getBean( - "connectorFacadeProxy", ConnectorFacadeProxy.class, connInstanceClone); + Connector connector = new ConnectorFacadeProxy(connInstanceClone); + ApplicationContextProvider.getBeanFactory().autowireBean(connector); + + return connector; } @Override @@ -104,21 +106,30 @@ class ConnectorManager implements Connec @Transactional(readOnly = true) @Override public void load() { - // This is needed to avoid encoding problems when sending error messages via REST + // This is needed in order to avoid encoding problems when sending error messages via REST CurrentLocale.set(Locale.ENGLISH); - // Next load all resource-specific connectors. + // Init ConnIdBundleManager + List<ConnectorInfo> connInfos = ConnIdBundleManager.getConnManager().getConnectorInfos(); + if (LOG.isDebugEnabled()) { + for (ConnectorInfo connInfo : connInfos) { + LOG.debug("Found connector bundle {}", connInfo.getConnectorDisplayName()); + } + } + + // Next load all resource-specific connectors + int connectors = 0; for (ExternalResource resource : resourceDAO.findAll()) { LOG.info("Registering resource-connector pair {}-{}", resource, resource.getConnector()); try { registerConnector(resource); + connectors++; } catch (Exception e) { LOG.error("While registering resource-connector pair {}-{}", resource, resource.getConnector(), e); } } - LOG.info("Done loading {} connectors", ApplicationContextProvider.getBeanFactory().getBeansOfType( - ConnectorFacadeProxy.class, false, true).size()); + LOG.info("Done loading {} connectors", connectors); } @Transactional(readOnly = true) @@ -137,6 +148,7 @@ class ConnectorManager implements Connec LOG.info("Done unloading {} connectors", connectors); ConnectorFacadeFactory.getInstance().dispose(); + ConnIdBundleManager.resetConnManager(); LOG.info("All connector resources disposed"); } } Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/propagation/impl/AsyncConnectorFacade.java URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/propagation/impl/AsyncConnectorFacade.java?rev=1448677&r1=1448676&r2=1448677&view=diff ============================================================================== --- syncope/trunk/core/src/main/java/org/apache/syncope/core/propagation/impl/AsyncConnectorFacade.java (original) +++ syncope/trunk/core/src/main/java/org/apache/syncope/core/propagation/impl/AsyncConnectorFacade.java Thu Feb 21 15:15:45 2013 @@ -24,6 +24,7 @@ import java.util.concurrent.Future; import org.identityconnectors.framework.api.ConnectorFacade; import org.identityconnectors.framework.common.objects.Attribute; import org.identityconnectors.framework.common.objects.AttributeInfo; +import org.identityconnectors.framework.common.objects.AttributeUtil; import org.identityconnectors.framework.common.objects.ConnectorObject; import org.identityconnectors.framework.common.objects.ObjectClass; import org.identityconnectors.framework.common.objects.ObjectClassInfo; @@ -139,24 +140,21 @@ public class AsyncConnectorFacade { } @Async - public Future<Set<String>> getSchema( - final ConnectorFacade connector, - final boolean showall) { + public Future<Set<String>> getSchema(final ConnectorFacade connector, final boolean showall) { final Set<String> resourceSchemaNames = new HashSet<String>(); - final Schema schema = connector.schema(); - try { + final Schema schema = connector.schema(); for (ObjectClassInfo info : schema.getObjectClassInfo()) { for (AttributeInfo attrInfo : info.getAttributeInfo()) { - if (showall || !isSpecialName(attrInfo.getName())) { + if (showall || !AttributeUtil.isSpecialName(attrInfo.getName())) { resourceSchemaNames.add(attrInfo.getName()); } } } } catch (Exception e) { // catch exception in order to manage unpredictable behaviors - LOG.debug("Unsupported operation {}", e); + LOG.debug("While reading schema on connector {}", connector, e); } return new AsyncResult<Set<String>>(resourceSchemaNames); @@ -173,8 +171,4 @@ public class AsyncConnectorFacade { connector.test(); return new AsyncResult<String>("OK"); } - - private boolean isSpecialName(final String name) { - return (name.startsWith("__") && name.endsWith("__")); - } } Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/PolicyController.java URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/PolicyController.java?rev=1448677&r1=1448676&r2=1448677&view=diff ============================================================================== --- syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/PolicyController.java (original) +++ syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/PolicyController.java Thu Feb 21 15:15:45 2013 @@ -148,7 +148,7 @@ public class PolicyController extends Ab final List<T> policyTOs = new ArrayList<T>(); for (Policy policy : policies) { - policyTOs.add((T) binder.getPolicyTO(policy)); + policyTOs.add(binder.<T>getPolicyTO(policy)); } auditManager.audit(Category.policy, PolicySubCategory.list, Result.success, Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/utils/RestServiceExceptionMapper.java URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/utils/RestServiceExceptionMapper.java?rev=1448677&r1=1448676&r2=1448677&view=diff ============================================================================== --- syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/utils/RestServiceExceptionMapper.java (original) +++ syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/utils/RestServiceExceptionMapper.java Thu Feb 21 15:15:45 2013 @@ -18,16 +18,15 @@ */ package org.apache.syncope.core.rest.utils; -import java.util.Map.Entry; +import java.util.Map; import java.util.Set; - import javax.persistence.PersistenceException; +import javax.ws.rs.BadRequestException; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.ResponseBuilder; import javax.ws.rs.ext.ExceptionMapper; import javax.ws.rs.ext.Provider; - import org.apache.cxf.jaxrs.client.ResponseExceptionMapper; import org.apache.syncope.common.services.InvalidSearchConditionException; import org.apache.syncope.common.types.EntityViolationType; @@ -46,12 +45,15 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.orm.jpa.JpaSystemException; +import org.springframework.security.access.AccessDeniedException; @Provider public class RestServiceExceptionMapper implements ExceptionMapper<Exception>, ResponseExceptionMapper<Exception> { private static final String BASIC_REALM_UNAUTHORIZED = "Basic realm=\"Spring Security Application\""; + private static final Logger LOG = LoggerFactory.getLogger(RestServiceExceptionMapper.class); + public static final String EXCEPTION_TYPE_HEADER = "ExceptionType"; @Override @@ -59,22 +61,25 @@ public class RestServiceExceptionMapper LOG.error("Exception thrown by REST method: " + ex.getMessage(), ex); if (ex instanceof SyncopeClientCompositeErrorException) { - return getCompositeExceptionResponse(ex); + return getCompositeExceptionResponse((SyncopeClientCompositeErrorException) ex); } - if (ex instanceof org.springframework.security.access.AccessDeniedException) { - return Response.status(Response.Status.UNAUTHORIZED) - .header(HttpHeaders.WWW_AUTHENTICATE, BASIC_REALM_UNAUTHORIZED).build(); + if (ex instanceof AccessDeniedException) { + return Response.status(Response.Status.UNAUTHORIZED). + header(HttpHeaders.WWW_AUTHENTICATE, BASIC_REALM_UNAUTHORIZED). + build(); } if (ex instanceof UnauthorizedRoleException) { - return buildResponse(Response.status(Response.Status.FORBIDDEN), SyncopeClientExceptionType.UnauthorizedRole, + return buildResponse(Response.status(Response.Status.FORBIDDEN), + SyncopeClientExceptionType.UnauthorizedRole, getExMessage(ex)); } if (ex instanceof DataIntegrityViolationException) { - return buildResponse(Response.status(Response.Status.CONFLICT), - SyncopeClientExceptionType.DataIntegrityViolation, getExMessage(ex)); + return buildResponse(Response.status(Response.Status.CONFLICT), + SyncopeClientExceptionType.DataIntegrityViolation, + getExMessage(ex)); } Response response = processBadRequestExceptions(ex); @@ -93,21 +98,20 @@ public class RestServiceExceptionMapper } // Rest is interpreted as InternalServerError - return Response.status(Response.Status.INTERNAL_SERVER_ERROR) - .header(SyncopeClientExceptionType.Unknown.getElementHeaderName(), getExMessage(ex)) - .build(); + return Response.status(Response.Status.INTERNAL_SERVER_ERROR). + header(SyncopeClientExceptionType.Unknown.getElementHeaderName(), getExMessage(ex)). + build(); } - + @Override public Exception fromResponse(final Response r) { throw new UnsupportedOperationException( "Call of fromResponse() method is not expected in RestServiceExceptionMapper"); } - public Response getCompositeExceptionResponse(Exception ex) { - ResponseBuilder responseBuilder = Response.status(((SyncopeClientCompositeErrorException) ex) - .getStatusCode().value()); - for (SyncopeClientException sce : ((SyncopeClientCompositeErrorException) ex).getExceptions()) { + private Response getCompositeExceptionResponse(final SyncopeClientCompositeErrorException ex) { + ResponseBuilder responseBuilder = Response.status(ex.getStatusCode().value()); + for (SyncopeClientException sce : ex.getExceptions()) { responseBuilder.header(EXCEPTION_TYPE_HEADER, sce.getType().getHeaderValue()); for (String attributeName : sce.getElements()) { @@ -117,7 +121,7 @@ public class RestServiceExceptionMapper return responseBuilder.build(); } - private Response processServerErrorExceptions(Exception ex) { + private Response processServerErrorExceptions(final Exception ex) { ResponseBuilder responseBuilder = Response.status(Response.Status.INTERNAL_SERVER_ERROR); if (ex instanceof org.apache.ibatis.exceptions.PersistenceException) { return buildResponse(responseBuilder, SyncopeClientExceptionType.Workflow, getMessage(ex, @@ -126,13 +130,13 @@ public class RestServiceExceptionMapper return buildResponse(responseBuilder, SyncopeClientExceptionType.DataIntegrityViolation, getExMessage(ex)); } else if (ex instanceof ConfigurationException) { - return buildResponse(responseBuilder, SyncopeClientExceptionType.InvalidExternalResource, getExMessage(ex)); + return buildResponse(responseBuilder, SyncopeClientExceptionType.InvalidConnIdConf, getExMessage(ex)); } return null; } - private Response processNotFoundExceptions(Exception ex) { + private Response processNotFoundExceptions(final Exception ex) { ResponseBuilder responseBuilder = Response.status(Response.Status.NOT_FOUND); if (ex instanceof javax.ws.rs.NotFoundException) { @@ -148,40 +152,38 @@ public class RestServiceExceptionMapper return null; } - private Response processBadRequestExceptions(Exception ex) { + private Response processBadRequestExceptions(final Exception ex) { ResponseBuilder responseBuilder = Response.status(Response.Status.BAD_REQUEST); - if (ex instanceof javax.ws.rs.BadRequestException) { - if (((javax.ws.rs.BadRequestException) ex).getResponse() != null) { - return ((javax.ws.rs.BadRequestException) ex).getResponse(); - } else { + if (ex instanceof BadRequestException) { + if (((BadRequestException) ex).getResponse() == null) { return responseBuilder.build(); + } else { + return ((BadRequestException) ex).getResponse(); } - + } else if (ex instanceof InvalidEntityException) { SyncopeClientExceptionType exType = SyncopeClientExceptionType.valueOf("Invalid" + ((InvalidEntityException) ex).getEntityClassSimpleName()); responseBuilder.header(SyncopeClientErrorHandler.EXCEPTION_TYPE_HEADER, exType.getHeaderValue()); - for (@SuppressWarnings("rawtypes") - Entry<Class, Set<EntityViolationType>> violation : ((InvalidEntityException) ex).getViolations().entrySet()) { + for (@SuppressWarnings("rawtypes") Map.Entry<Class, Set<EntityViolationType>> violation : + ((InvalidEntityException) ex).getViolations().entrySet()) { for (EntityViolationType violationType : violation.getValue()) { - responseBuilder.header(exType.getElementHeaderName(), violation.getClass().getSimpleName() + ": " - + violationType); + responseBuilder.header(exType.getElementHeaderName(), + violation.getClass().getSimpleName() + ": " + violationType); } } return responseBuilder.build(); } else if (ex instanceof WorkflowException) { return buildResponse(responseBuilder, SyncopeClientExceptionType.Workflow, getExMessage(ex)); - } else if (ex instanceof PropagationException) { - return buildResponse(responseBuilder, SyncopeClientExceptionType.Propagation, getMessage(ex, ((PropagationException) ex).getResourceName())); - + return buildResponse(responseBuilder, SyncopeClientExceptionType.Propagation, getMessage(ex, + ((PropagationException) ex).getResourceName())); } else if (ex instanceof InvalidSearchConditionException) { return buildResponse(responseBuilder, SyncopeClientExceptionType.InvalidSearchCondition, getExMessage(ex)); - } else if (ex instanceof PersistenceException) { return buildResponse(responseBuilder, SyncopeClientExceptionType.GenericPersistence, getExMessage(ex)); } @@ -189,17 +191,19 @@ public class RestServiceExceptionMapper return null; } - private Response buildResponse(ResponseBuilder responseBuilder, SyncopeClientExceptionType hType, String msg) { - return responseBuilder.header(SyncopeClientErrorHandler.EXCEPTION_TYPE_HEADER, hType.getHeaderValue()) - .header(hType.getElementHeaderName(), msg) - .build(); + private Response buildResponse(final ResponseBuilder responseBuilder, final SyncopeClientExceptionType hType, + final String msg) { + + return responseBuilder.header(SyncopeClientErrorHandler.EXCEPTION_TYPE_HEADER, hType.getHeaderValue()). + header(hType.getElementHeaderName(), msg). + build(); } - public String getMessage(Throwable ex, String msg) { - return (msg != null) ? msg : getExMessage(ex); + private String getMessage(final Throwable ex, final String msg) { + return (msg == null) ? getExMessage(ex) : msg; } - public String getExMessage(Throwable ex) { + private String getExMessage(final Throwable ex) { return (ex.getCause() == null) ? ex.getMessage() : ex.getCause().getMessage(); } -} +} \ No newline at end of file Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/util/ConnIdBundleManager.java URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/util/ConnIdBundleManager.java?rev=1448677&r1=1448676&r2=1448677&view=diff ============================================================================== --- syncope/trunk/core/src/main/java/org/apache/syncope/core/util/ConnIdBundleManager.java (original) +++ syncope/trunk/core/src/main/java/org/apache/syncope/core/util/ConnIdBundleManager.java Thu Feb 21 15:15:45 2013 @@ -111,6 +111,12 @@ public final class ConnIdBundleManager { connManager = manager; } + public static void resetConnManager() { + synchronized (LOCK) { + connManager = null; + } + } + public static ConnectorInfoManager getConnManager() { synchronized (LOCK) { if (connManager == null) { Modified: syncope/trunk/core/src/main/webapp/syncopeClientError.jsp URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/webapp/syncopeClientError.jsp?rev=1448677&r1=1448676&r2=1448677&view=diff ============================================================================== --- syncope/trunk/core/src/main/webapp/syncopeClientError.jsp (original) +++ syncope/trunk/core/src/main/webapp/syncopeClientError.jsp Thu Feb 21 15:15:45 2013 @@ -135,8 +135,8 @@ under the License. statusCode = HttpServletResponse.SC_BAD_REQUEST; } else if (ex instanceof ConfigurationException) { response.setHeader(SyncopeClientErrorHandler.EXCEPTION_TYPE_HEADER, - SyncopeClientExceptionType.InvalidExternalResource.getHeaderValue()); - response.setHeader(SyncopeClientExceptionType.InvalidExternalResource.getElementHeaderName(), + SyncopeClientExceptionType.InvalidConnIdConf.getHeaderValue()); + response.setHeader(SyncopeClientExceptionType.InvalidConnIdConf.getElementHeaderName(), ex.getCause() == null ? ex.getMessage() : ex.getCause().getMessage()); statusCode = HttpServletResponse.SC_BAD_REQUEST;