it.doqui.index.ecmengine.client.webservices.AbstractWebServiceDelegateBase.java Source code

Java tutorial

Introduction

Here is the source code for it.doqui.index.ecmengine.client.webservices.AbstractWebServiceDelegateBase.java

Source

/* 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");
            }
        }
    }

}