/* Index ECM Engine - A system for managing the capture (when created * or received), classification (cataloguing), storage, retrieval, * revision, sharing, reuse and disposition of documents. * * Copyright (C) 2008 Regione Piemonte * Copyright (C) 2008 Provincia di Torino * Copyright (C) 2008 Comune di Torino * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2, * or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ package it.doqui.index.ecmengine.client.webservices; import static it.doqui.index.ecmengine.client.webservices.util.EcmEngineWebServiceConstants.ECMENGINE_WEB_SERVICE_LOG_CATEGORY; import it.doqui.index.ecmengine.client.webservices.exception.EcmEngineException; import it.doqui.index.ecmengine.client.webservices.exception.InvalidParameterException; import it.doqui.index.ecmengine.client.webservices.exception.publishing.EcmEngineTransactionException; import it.doqui.index.ecmengine.client.webservices.exception.publishing.InvalidCredentialsException; import it.doqui.index.ecmengine.client.webservices.exception.publishing.NoDataExtractedException; import it.doqui.index.ecmengine.client.webservices.exception.publishing.NoSuchNodeException; import it.doqui.index.ecmengine.client.webservices.exception.publishing.PermissionDeniedException; import it.doqui.index.ecmengine.client.webservices.exception.publishing.backoffice.AclEditException; import it.doqui.index.ecmengine.client.webservices.exception.publishing.backoffice.GroupAlreadyExistsException; import it.doqui.index.ecmengine.client.webservices.exception.publishing.backoffice.GroupCreateException; import it.doqui.index.ecmengine.client.webservices.exception.publishing.backoffice.GroupDeleteException; import it.doqui.index.ecmengine.client.webservices.exception.publishing.backoffice.GroupEditException; import it.doqui.index.ecmengine.client.webservices.exception.publishing.backoffice.NoSuchGroupException; import it.doqui.index.ecmengine.client.webservices.exception.publishing.backoffice.NoSuchUserException; import it.doqui.index.ecmengine.client.webservices.exception.publishing.backoffice.TooManyNodesException; import it.doqui.index.ecmengine.client.webservices.exception.publishing.backoffice.UserAlreadyExistsException; import it.doqui.index.ecmengine.client.webservices.exception.publishing.backoffice.UserCreateException; import it.doqui.index.ecmengine.client.webservices.exception.publishing.backoffice.UserDeleteException; import it.doqui.index.ecmengine.client.webservices.exception.publishing.backoffice.UserUpdateException; import it.doqui.index.ecmengine.client.webservices.exception.publishing.engine.management.AuditTrailException; import it.doqui.index.ecmengine.client.webservices.exception.publishing.engine.management.CheckInCheckOutException; import it.doqui.index.ecmengine.client.webservices.exception.publishing.engine.management.DeleteException; import it.doqui.index.ecmengine.client.webservices.exception.publishing.engine.management.InsertException; import it.doqui.index.ecmengine.client.webservices.exception.publishing.engine.management.MoveException; import it.doqui.index.ecmengine.client.webservices.exception.publishing.engine.management.ReadException; import it.doqui.index.ecmengine.client.webservices.exception.publishing.engine.management.TransformException; import it.doqui.index.ecmengine.client.webservices.exception.publishing.engine.management.UnsupportedTransformationException; import it.doqui.index.ecmengine.client.webservices.exception.publishing.engine.management.UpdateException; import it.doqui.index.ecmengine.client.webservices.exception.publishing.engine.management.WorkflowException; import it.doqui.index.ecmengine.client.webservices.exception.publishing.engine.search.SearchException; import it.doqui.index.ecmengine.client.webservices.exception.publishing.engine.search.TooManyResultsException; import java.beans.PropertyDescriptor; import java.lang.reflect.Array; import java.lang.reflect.Method; import java.util.Calendar; import java.util.Date; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.BeanUtils; public abstract class AbstractWebServiceDelegateBase { protected static Log log = LogFactory.getLog(ECMENGINE_WEB_SERVICE_LOG_CATEGORY); @SuppressWarnings("unchecked") protected Object convertDTO(Object sourceDTO, Class destDTOClass) throws Exception { if (log.isDebugEnabled()) { log.debug("["+getClass().getSimpleName()+"::convertDTO] BEGIN"); } Object destDTO = null; try { if (sourceDTO != null) { if (log.isDebugEnabled()) { log.debug("["+getClass().getSimpleName()+"::convertDTO] converting DTO from type "+sourceDTO.getClass().getName()+" to type "+destDTOClass.getName()); } destDTO = BeanUtils.instantiateClass(destDTOClass); PropertyDescriptor[] targetpds = BeanUtils.getPropertyDescriptors(destDTOClass); PropertyDescriptor sourcepd = null; if (log.isDebugEnabled()) { log.debug(" found "+targetpds.length+" properties for type "+destDTOClass.getName()); } for (int i=0; i<targetpds.length; i++) { if (targetpds[i].getWriteMethod() != null) { Method writeMethod = targetpds[i].getWriteMethod(); sourcepd = BeanUtils.getPropertyDescriptor(sourceDTO.getClass(), targetpds[i].getName()); if (sourcepd != null && sourcepd.getReadMethod() != null) { if (log.isDebugEnabled()) { log.debug("["+getClass().getSimpleName()+"::convertDTO] found property: "+targetpds[i].getName()); log.debug("["+getClass().getSimpleName()+"::convertDTO] source type: "+sourcepd.getPropertyType().getName()+", dest type: "+targetpds[i].getPropertyType().getName()); } Method readMethod = sourcepd.getReadMethod(); Object valueObject = null; if (!BeanUtils.isSimpleProperty(targetpds[i].getPropertyType())) { if (sourcepd.getPropertyType().isArray()) { valueObject = convertDTOArray((Object[])readMethod.invoke(sourceDTO, new Object[]{}), targetpds[i].getPropertyType().getComponentType()); } else if (sourcepd.getPropertyType().equals(java.util.Calendar.class) && targetpds[i].getPropertyType().equals(java.util.Date.class)) { // if java.util.Calendar => convert to java.util.Date valueObject = readMethod.invoke(sourceDTO, new Object[0]); if (valueObject != null) { valueObject = ((Calendar)valueObject).getTime(); } } else if (sourcepd.getPropertyType().equals(java.util.Date.class) && targetpds[i].getPropertyType().equals(java.util.Calendar.class)) { // if java.util.Date => convert to java.util.Calendar Calendar calendar = Calendar.getInstance(); valueObject = readMethod.invoke(sourceDTO, new Object[0]); if (valueObject != null) { calendar.setTime((Date)valueObject); valueObject = calendar; } } else { valueObject = convertDTO(readMethod.invoke(sourceDTO, new Object[0]), targetpds[i].getPropertyType()); } } else { valueObject = readMethod.invoke(sourceDTO, new Object[0]); } if (log.isDebugEnabled()) { log.debug("["+getClass().getSimpleName()+"::convertDTO] writing value: "+valueObject); } writeMethod.invoke(destDTO, new Object[]{ valueObject }); } else { if (log.isDebugEnabled()) { log.debug("["+getClass().getSimpleName()+"::convertDTO] skipping property: "+targetpds[i].getName()); } } } } } } catch(Exception e) { log.error("["+getClass().getSimpleName()+"::convertDTO] ERROR", e); throw e; } finally { if (log.isDebugEnabled()) { log.debug("["+getClass().getSimpleName()+"::convertDTO] END"); } } return destDTO; } @SuppressWarnings("unchecked") protected Object[] convertDTOArray(Object[] sourceDTOArray, Class destDTOClass) throws Exception { if (log.isDebugEnabled()) { log.debug("["+getClass().getSimpleName()+"::convertDTOArray] BEGIN"); } Object[] destDTOArray = null; try { if (sourceDTOArray != null) { if (log.isDebugEnabled()) { log.debug("["+getClass().getSimpleName()+"::convertDTOArray] converting array with "+sourceDTOArray.length+" elements"); } destDTOArray = (Object[])Array.newInstance(destDTOClass, sourceDTOArray.length); for (int i=0; i<sourceDTOArray.length; i++) { destDTOArray[i] = convertDTO(sourceDTOArray[i], destDTOClass); } } } catch(Exception e) { log.debug("["+getClass().getSimpleName()+"::convertDTOArray] ERROR", e); throw e; } finally { if (log.isDebugEnabled()) { log.debug("["+getClass().getSimpleName()+"::convertDTOArray] END"); } } return destDTOArray; } protected void handleException(Exception e) throws EcmEngineException { if (log.isDebugEnabled()) { log.debug("["+getClass().getSimpleName()+"::handleException] BEGIN"); log.debug("["+getClass().getSimpleName()+"::handleException] caught: "+e.getClass().getName()); } try { if (e instanceof it.doqui.index.ecmengine.exception.InvalidParameterException) { throw new InvalidParameterException(e.getMessage()); } else if (e instanceof it.doqui.index.ecmengine.exception.publishing.InvalidCredentialsException) { throw new InvalidCredentialsException(e.getMessage()); } else if (e instanceof it.doqui.index.ecmengine.exception.publishing.NoDataExtractedException) { throw new NoDataExtractedException(e.getMessage()); } else if (e instanceof it.doqui.index.ecmengine.exception.publishing.NoSuchNodeException) { throw new NoSuchNodeException(e.getMessage()); } else if (e instanceof it.doqui.index.ecmengine.exception.publishing.PermissionDeniedException) { throw new PermissionDeniedException(e.getMessage()); } else if (e instanceof it.doqui.index.ecmengine.exception.publishing.EcmEngineTransactionException) { throw new EcmEngineTransactionException(e.getMessage()); } else if (e instanceof it.doqui.index.ecmengine.exception.publishing.engine.management.AuditTrailException) { throw new AuditTrailException(e.getMessage()); } else if (e instanceof it.doqui.index.ecmengine.exception.publishing.engine.management.CheckInCheckOutException) { throw new CheckInCheckOutException(e.getMessage()); } else if (e instanceof it.doqui.index.ecmengine.exception.publishing.engine.management.DeleteException) { throw new DeleteException(e.getMessage()); } else if (e instanceof it.doqui.index.ecmengine.exception.publishing.engine.management.InsertException) { throw new InsertException(e.getMessage()); } else if (e instanceof it.doqui.index.ecmengine.exception.publishing.engine.management.MoveException) { throw new MoveException(e.getMessage()); } else if (e instanceof it.doqui.index.ecmengine.exception.publishing.engine.management.ReadException) { throw new ReadException(e.getMessage()); } else if (e instanceof it.doqui.index.ecmengine.exception.publishing.engine.management.TransformException) { throw new TransformException(e.getMessage()); } else if (e instanceof it.doqui.index.ecmengine.exception.publishing.engine.management.UnsupportedTransformationException) { throw new UnsupportedTransformationException(e.getMessage()); } else if (e instanceof it.doqui.index.ecmengine.exception.publishing.engine.management.UpdateException) { throw new UpdateException(e.getMessage()); } else if (e instanceof it.doqui.index.ecmengine.exception.publishing.engine.management.WorkflowException) { throw new WorkflowException(e.getMessage()); } else if (e instanceof it.doqui.index.ecmengine.exception.publishing.backoffice.AclEditException) { throw new AclEditException(e.getMessage()); } else if (e instanceof it.doqui.index.ecmengine.exception.publishing.backoffice.GroupAlreadyExistsException) { throw new GroupAlreadyExistsException(e.getMessage()); } else if (e instanceof it.doqui.index.ecmengine.exception.publishing.backoffice.GroupCreateException) { throw new GroupCreateException(e.getMessage()); } else if (e instanceof it.doqui.index.ecmengine.exception.publishing.backoffice.GroupDeleteException) { throw new GroupDeleteException(e.getMessage()); } else if (e instanceof it.doqui.index.ecmengine.exception.publishing.backoffice.GroupEditException) { throw new GroupEditException(e.getMessage()); } else if (e instanceof it.doqui.index.ecmengine.exception.publishing.backoffice.NoSuchGroupException) { throw new NoSuchGroupException(e.getMessage()); } else if (e instanceof it.doqui.index.ecmengine.exception.publishing.backoffice.NoSuchUserException) { throw new NoSuchUserException(e.getMessage()); } else if (e instanceof it.doqui.index.ecmengine.exception.publishing.backoffice.TooManyNodesException) { throw new TooManyNodesException(e.getMessage()); } else if (e instanceof it.doqui.index.ecmengine.exception.publishing.backoffice.UserAlreadyExistsException) { throw new UserAlreadyExistsException(e.getMessage()); } else if (e instanceof it.doqui.index.ecmengine.exception.publishing.backoffice.UserCreateException) { throw new UserCreateException(e.getMessage()); } else if (e instanceof it.doqui.index.ecmengine.exception.publishing.backoffice.UserDeleteException) { throw new UserDeleteException(e.getMessage()); } else if (e instanceof it.doqui.index.ecmengine.exception.publishing.backoffice.UserUpdateException) { throw new UserUpdateException(e.getMessage()); } else if (e instanceof it.doqui.index.ecmengine.exception.publishing.engine.search.SearchException) { throw new SearchException(e.getMessage()); } else if (e instanceof it.doqui.index.ecmengine.exception.publishing.engine.search.TooManyResultsException) { throw new TooManyResultsException(e.getMessage()); } else { throw new EcmEngineException(e.getMessage()); } } catch(EcmEngineException te) { log.debug("["+getClass().getSimpleName()+"::handleException] thrown: "+te.getClass().getName()); throw te; } finally { if (log.isDebugEnabled()) { log.debug("["+getClass().getSimpleName()+"::handleException] END"); } } } }