All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.bonitasoft.engine.service.ModelConvertor Maven / Gradle / Ivy

/**
 * Copyright (C) 2011-2013 BonitaSoft S.A.
 * BonitaSoft, 32 rue Gustave Eiffel - 38000 Grenoble
 * This library is free software; you can redistribute it and/or modify it under the terms
 * of the GNU Lesser General Public License as published by the Free Software Foundation
 * version 2.1 of the License.
 * This library 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 Lesser General Public License for more details.
 * You should have received a copy of the GNU Lesser General Public License along with this
 * program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
 * Floor, Boston, MA 02110-1301, USA.
 **/
package org.bonitasoft.engine.service;

import java.io.IOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.bonitasoft.engine.actor.mapping.model.SActor;
import org.bonitasoft.engine.actor.mapping.model.SActorMember;
import org.bonitasoft.engine.bpm.actor.ActorInstance;
import org.bonitasoft.engine.bpm.actor.ActorMember;
import org.bonitasoft.engine.bpm.actor.impl.ActorInstanceImpl;
import org.bonitasoft.engine.bpm.actor.impl.ActorMemberImpl;
import org.bonitasoft.engine.bpm.category.Category;
import org.bonitasoft.engine.bpm.category.impl.CategoryImpl;
import org.bonitasoft.engine.bpm.comment.ArchivedComment;
import org.bonitasoft.engine.bpm.comment.Comment;
import org.bonitasoft.engine.bpm.comment.impl.ArchivedCommentImpl;
import org.bonitasoft.engine.bpm.comment.impl.CommentImpl;
import org.bonitasoft.engine.bpm.connector.ArchivedConnectorInstance;
import org.bonitasoft.engine.bpm.connector.ConnectorDefinition;
import org.bonitasoft.engine.bpm.connector.ConnectorImplementationDescriptor;
import org.bonitasoft.engine.bpm.connector.ConnectorInstance;
import org.bonitasoft.engine.bpm.connector.ConnectorState;
import org.bonitasoft.engine.bpm.connector.impl.ArchivedConnectorInstanceImpl;
import org.bonitasoft.engine.bpm.connector.impl.ConnectorDefinitionImpl;
import org.bonitasoft.engine.bpm.connector.impl.ConnectorInstanceImpl;
import org.bonitasoft.engine.bpm.data.DataDefinition;
import org.bonitasoft.engine.bpm.data.DataInstance;
import org.bonitasoft.engine.bpm.data.impl.BlobDataInstanceImpl;
import org.bonitasoft.engine.bpm.data.impl.BooleanDataInstanceImpl;
import org.bonitasoft.engine.bpm.data.impl.DataDefinitionImpl;
import org.bonitasoft.engine.bpm.data.impl.DataInstanceImpl;
import org.bonitasoft.engine.bpm.data.impl.DateDataInstanceImpl;
import org.bonitasoft.engine.bpm.data.impl.DoubleDataInstanceImpl;
import org.bonitasoft.engine.bpm.data.impl.FloatDataInstanceImpl;
import org.bonitasoft.engine.bpm.data.impl.IntegerDataInstanceImpl;
import org.bonitasoft.engine.bpm.data.impl.LongDataInstanceImpl;
import org.bonitasoft.engine.bpm.data.impl.ShortTextDataInstanceImpl;
import org.bonitasoft.engine.bpm.document.ArchivedDocument;
import org.bonitasoft.engine.bpm.document.Document;
import org.bonitasoft.engine.bpm.document.impl.ArchivedDocumentImpl;
import org.bonitasoft.engine.bpm.document.impl.DocumentImpl;
import org.bonitasoft.engine.bpm.flownode.ActivityInstance;
import org.bonitasoft.engine.bpm.flownode.ActivityStates;
import org.bonitasoft.engine.bpm.flownode.ArchivedActivityInstance;
import org.bonitasoft.engine.bpm.flownode.ArchivedAutomaticTaskInstance;
import org.bonitasoft.engine.bpm.flownode.ArchivedCallActivityInstance;
import org.bonitasoft.engine.bpm.flownode.ArchivedFlowElementInstance;
import org.bonitasoft.engine.bpm.flownode.ArchivedFlowNodeInstance;
import org.bonitasoft.engine.bpm.flownode.ArchivedGatewayInstance;
import org.bonitasoft.engine.bpm.flownode.ArchivedHumanTaskInstance;
import org.bonitasoft.engine.bpm.flownode.ArchivedLoopActivityInstance;
import org.bonitasoft.engine.bpm.flownode.ArchivedManualTaskInstance;
import org.bonitasoft.engine.bpm.flownode.ArchivedReceiveTaskInstance;
import org.bonitasoft.engine.bpm.flownode.ArchivedSendTaskInstance;
import org.bonitasoft.engine.bpm.flownode.ArchivedSubProcessActivityInstance;
import org.bonitasoft.engine.bpm.flownode.ArchivedUserTaskInstance;
import org.bonitasoft.engine.bpm.flownode.BPMEventType;
import org.bonitasoft.engine.bpm.flownode.EventInstance;
import org.bonitasoft.engine.bpm.flownode.FlowNodeInstance;
import org.bonitasoft.engine.bpm.flownode.GatewayInstance;
import org.bonitasoft.engine.bpm.flownode.HumanTaskInstance;
import org.bonitasoft.engine.bpm.flownode.ManualTaskInstance;
import org.bonitasoft.engine.bpm.flownode.StateCategory;
import org.bonitasoft.engine.bpm.flownode.TaskPriority;
import org.bonitasoft.engine.bpm.flownode.UserTaskInstance;
import org.bonitasoft.engine.bpm.flownode.WaitingEvent;
import org.bonitasoft.engine.bpm.flownode.impl.ActivityInstanceImpl;
import org.bonitasoft.engine.bpm.flownode.impl.ArchivedActivityInstanceImpl;
import org.bonitasoft.engine.bpm.flownode.impl.ArchivedAutomaticTaskInstanceImpl;
import org.bonitasoft.engine.bpm.flownode.impl.ArchivedCallActivityInstanceImpl;
import org.bonitasoft.engine.bpm.flownode.impl.ArchivedFlowNodeInstanceImpl;
import org.bonitasoft.engine.bpm.flownode.impl.ArchivedGatewayInstanceImpl;
import org.bonitasoft.engine.bpm.flownode.impl.ArchivedHumanTaskInstanceImpl;
import org.bonitasoft.engine.bpm.flownode.impl.ArchivedLoopActivityInstanceImpl;
import org.bonitasoft.engine.bpm.flownode.impl.ArchivedManualTaskInstanceImpl;
import org.bonitasoft.engine.bpm.flownode.impl.ArchivedMultiInstanceActivityInstanceImpl;
import org.bonitasoft.engine.bpm.flownode.impl.ArchivedReceiveTaskInstanceImpl;
import org.bonitasoft.engine.bpm.flownode.impl.ArchivedSendTaskInstanceImpl;
import org.bonitasoft.engine.bpm.flownode.impl.ArchivedSubProcessActivityInstanceImpl;
import org.bonitasoft.engine.bpm.flownode.impl.ArchivedUserTaskInstanceImpl;
import org.bonitasoft.engine.bpm.flownode.impl.AutomaticTaskInstanceImpl;
import org.bonitasoft.engine.bpm.flownode.impl.BoundaryEventInstanceImpl;
import org.bonitasoft.engine.bpm.flownode.impl.CallActivityInstanceImpl;
import org.bonitasoft.engine.bpm.flownode.impl.EndEventInstanceImpl;
import org.bonitasoft.engine.bpm.flownode.impl.EventInstanceImpl;
import org.bonitasoft.engine.bpm.flownode.impl.FlowNodeInstanceImpl;
import org.bonitasoft.engine.bpm.flownode.impl.GatewayInstanceImpl;
import org.bonitasoft.engine.bpm.flownode.impl.HumanTaskInstanceImpl;
import org.bonitasoft.engine.bpm.flownode.impl.IntermediateCatchEventInstanceImpl;
import org.bonitasoft.engine.bpm.flownode.impl.IntermediateThrowEventInstanceImpl;
import org.bonitasoft.engine.bpm.flownode.impl.LoopActivityInstanceImpl;
import org.bonitasoft.engine.bpm.flownode.impl.ManualTaskInstanceImpl;
import org.bonitasoft.engine.bpm.flownode.impl.MultiInstanceActivityInstanceImpl;
import org.bonitasoft.engine.bpm.flownode.impl.ReceiveTaskInstanceImpl;
import org.bonitasoft.engine.bpm.flownode.impl.SendTaskInstanceImpl;
import org.bonitasoft.engine.bpm.flownode.impl.StartEventInstanceImpl;
import org.bonitasoft.engine.bpm.flownode.impl.SubProcessActivityInstanceImpl;
import org.bonitasoft.engine.bpm.flownode.impl.UserTaskInstanceImpl;
import org.bonitasoft.engine.bpm.flownode.impl.WaitingErrorEventImpl;
import org.bonitasoft.engine.bpm.flownode.impl.WaitingMessageEventImpl;
import org.bonitasoft.engine.bpm.flownode.impl.WaitingSignalEventImpl;
import org.bonitasoft.engine.bpm.process.ActivationState;
import org.bonitasoft.engine.bpm.process.ArchivedProcessInstance;
import org.bonitasoft.engine.bpm.process.ConfigurationState;
import org.bonitasoft.engine.bpm.process.ProcessDefinition;
import org.bonitasoft.engine.bpm.process.ProcessDeploymentInfo;
import org.bonitasoft.engine.bpm.process.ProcessInstance;
import org.bonitasoft.engine.bpm.process.ProcessInstanceState;
import org.bonitasoft.engine.bpm.process.impl.ArchivedProcessInstanceImpl;
import org.bonitasoft.engine.bpm.process.impl.ProcessDefinitionImpl;
import org.bonitasoft.engine.bpm.process.impl.ProcessDeploymentInfoImpl;
import org.bonitasoft.engine.bpm.process.impl.ProcessInstanceBuilder;
import org.bonitasoft.engine.bpm.supervisor.ProcessSupervisor;
import org.bonitasoft.engine.bpm.supervisor.ProcessSupervisorBuilder;
import org.bonitasoft.engine.command.CommandDescriptor;
import org.bonitasoft.engine.command.CommandDescriptorImpl;
import org.bonitasoft.engine.command.model.SCommand;
import org.bonitasoft.engine.core.category.model.SCategory;
import org.bonitasoft.engine.core.connector.parser.SConnectorImplementationDescriptor;
import org.bonitasoft.engine.core.operation.model.SLeftOperand;
import org.bonitasoft.engine.core.operation.model.SOperation;
import org.bonitasoft.engine.core.operation.model.SOperatorType;
import org.bonitasoft.engine.core.operation.model.builder.SOperationBuilders;
import org.bonitasoft.engine.core.process.comment.model.SComment;
import org.bonitasoft.engine.core.process.comment.model.archive.SAComment;
import org.bonitasoft.engine.core.process.definition.ProcessDefinitionService;
import org.bonitasoft.engine.core.process.definition.SProcessDefinitionNotFoundException;
import org.bonitasoft.engine.core.process.definition.exception.SProcessDefinitionReadException;
import org.bonitasoft.engine.core.process.definition.model.SConnectorDefinition;
import org.bonitasoft.engine.core.process.definition.model.SProcessDefinition;
import org.bonitasoft.engine.core.process.definition.model.SProcessDefinitionDeployInfo;
import org.bonitasoft.engine.core.process.document.model.SAProcessDocument;
import org.bonitasoft.engine.core.process.document.model.SProcessDocument;
import org.bonitasoft.engine.core.process.instance.model.SActivityInstance;
import org.bonitasoft.engine.core.process.instance.model.SAutomaticTaskInstance;
import org.bonitasoft.engine.core.process.instance.model.SCallActivityInstance;
import org.bonitasoft.engine.core.process.instance.model.SConnectorInstance;
import org.bonitasoft.engine.core.process.instance.model.SFlowNodeInstance;
import org.bonitasoft.engine.core.process.instance.model.SGatewayInstance;
import org.bonitasoft.engine.core.process.instance.model.SHumanTaskInstance;
import org.bonitasoft.engine.core.process.instance.model.SLoopActivityInstance;
import org.bonitasoft.engine.core.process.instance.model.SManualTaskInstance;
import org.bonitasoft.engine.core.process.instance.model.SMultiInstanceActivityInstance;
import org.bonitasoft.engine.core.process.instance.model.SProcessInstance;
import org.bonitasoft.engine.core.process.instance.model.SReceiveTaskInstance;
import org.bonitasoft.engine.core.process.instance.model.SSendTaskInstance;
import org.bonitasoft.engine.core.process.instance.model.SSubProcessActivityInstance;
import org.bonitasoft.engine.core.process.instance.model.SUserTaskInstance;
import org.bonitasoft.engine.core.process.instance.model.archive.SAActivityInstance;
import org.bonitasoft.engine.core.process.instance.model.archive.SAAutomaticTaskInstance;
import org.bonitasoft.engine.core.process.instance.model.archive.SACallActivityInstance;
import org.bonitasoft.engine.core.process.instance.model.archive.SAConnectorInstance;
import org.bonitasoft.engine.core.process.instance.model.archive.SAFlowElementInstance;
import org.bonitasoft.engine.core.process.instance.model.archive.SAFlowNodeInstance;
import org.bonitasoft.engine.core.process.instance.model.archive.SAGatewayInstance;
import org.bonitasoft.engine.core.process.instance.model.archive.SAHumanTaskInstance;
import org.bonitasoft.engine.core.process.instance.model.archive.SALoopActivityInstance;
import org.bonitasoft.engine.core.process.instance.model.archive.SAManualTaskInstance;
import org.bonitasoft.engine.core.process.instance.model.archive.SAMultiInstanceActivityInstance;
import org.bonitasoft.engine.core.process.instance.model.archive.SAProcessInstance;
import org.bonitasoft.engine.core.process.instance.model.archive.SAReceiveTaskInstance;
import org.bonitasoft.engine.core.process.instance.model.archive.SASendTaskInstance;
import org.bonitasoft.engine.core.process.instance.model.archive.SASubProcessActivityInstance;
import org.bonitasoft.engine.core.process.instance.model.archive.SAUserTaskInstance;
import org.bonitasoft.engine.core.process.instance.model.event.SBoundaryEventInstance;
import org.bonitasoft.engine.core.process.instance.model.event.SEventInstance;
import org.bonitasoft.engine.core.process.instance.model.event.handling.SWaitingErrorEvent;
import org.bonitasoft.engine.core.process.instance.model.event.handling.SWaitingEvent;
import org.bonitasoft.engine.core.process.instance.model.event.handling.SWaitingMessageEvent;
import org.bonitasoft.engine.core.process.instance.model.event.handling.SWaitingSignalEvent;
import org.bonitasoft.engine.core.reporting.SReport;
import org.bonitasoft.engine.data.definition.model.SDataDefinition;
import org.bonitasoft.engine.data.instance.model.SDataInstance;
import org.bonitasoft.engine.exception.BonitaHomeConfigurationException;
import org.bonitasoft.engine.exception.BonitaHomeNotSetException;
import org.bonitasoft.engine.exception.UnknownElementType;
import org.bonitasoft.engine.execution.state.FlowNodeStateManager;
import org.bonitasoft.engine.expression.Expression;
import org.bonitasoft.engine.expression.exception.SInvalidExpressionException;
import org.bonitasoft.engine.expression.impl.ExpressionImpl;
import org.bonitasoft.engine.expression.model.SExpression;
import org.bonitasoft.engine.expression.model.builder.SExpressionBuilder;
import org.bonitasoft.engine.expression.model.builder.SExpressionBuilders;
import org.bonitasoft.engine.identity.ContactData;
import org.bonitasoft.engine.identity.ContactDataCreator.ContactDataField;
import org.bonitasoft.engine.identity.ExportedUser;
import org.bonitasoft.engine.identity.Group;
import org.bonitasoft.engine.identity.GroupCreator;
import org.bonitasoft.engine.identity.GroupCreator.GroupField;
import org.bonitasoft.engine.identity.Role;
import org.bonitasoft.engine.identity.RoleCreator;
import org.bonitasoft.engine.identity.RoleCreator.RoleField;
import org.bonitasoft.engine.identity.User;
import org.bonitasoft.engine.identity.UserCreator;
import org.bonitasoft.engine.identity.UserCreator.UserField;
import org.bonitasoft.engine.identity.UserMembership;
import org.bonitasoft.engine.identity.impl.ContactDataImpl;
import org.bonitasoft.engine.identity.impl.GroupImpl;
import org.bonitasoft.engine.identity.impl.RoleImpl;
import org.bonitasoft.engine.identity.impl.UserImpl;
import org.bonitasoft.engine.identity.impl.UserMembershipImpl;
import org.bonitasoft.engine.identity.model.SContactInfo;
import org.bonitasoft.engine.identity.model.SGroup;
import org.bonitasoft.engine.identity.model.SRole;
import org.bonitasoft.engine.identity.model.SUser;
import org.bonitasoft.engine.identity.model.SUserMembership;
import org.bonitasoft.engine.identity.model.builder.GroupBuilder;
import org.bonitasoft.engine.identity.model.builder.IdentityModelBuilder;
import org.bonitasoft.engine.identity.model.builder.RoleBuilder;
import org.bonitasoft.engine.identity.model.builder.SContactInfoBuilder;
import org.bonitasoft.engine.identity.model.builder.SUserBuilder;
import org.bonitasoft.engine.operation.LeftOperand;
import org.bonitasoft.engine.operation.Operation;
import org.bonitasoft.engine.operation.OperatorType;
import org.bonitasoft.engine.operation.impl.LeftOperandImpl;
import org.bonitasoft.engine.operation.impl.OperationImpl;
import org.bonitasoft.engine.platform.Platform;
import org.bonitasoft.engine.platform.command.model.SPlatformCommand;
import org.bonitasoft.engine.platform.impl.PlatformImpl;
import org.bonitasoft.engine.platform.model.SPlatform;
import org.bonitasoft.engine.profile.Profile;
import org.bonitasoft.engine.profile.ProfileEntry;
import org.bonitasoft.engine.profile.ProfileMember;
import org.bonitasoft.engine.profile.ProfileMemberCreator;
import org.bonitasoft.engine.profile.ProfileMemberCreator.ProfileMemberField;
import org.bonitasoft.engine.profile.builder.SProfileMemberBuilder;
import org.bonitasoft.engine.profile.impl.ProfileEntryImpl;
import org.bonitasoft.engine.profile.impl.ProfileImpl;
import org.bonitasoft.engine.profile.impl.ProfileMemberImpl;
import org.bonitasoft.engine.profile.model.SProfile;
import org.bonitasoft.engine.profile.model.SProfileEntry;
import org.bonitasoft.engine.profile.model.SProfileMember;
import org.bonitasoft.engine.reporting.Report;
import org.bonitasoft.engine.reporting.impl.ReportImpl;
import org.bonitasoft.engine.service.impl.ServiceAccessorFactory;
import org.bonitasoft.engine.session.APISession;
import org.bonitasoft.engine.session.SSessionNotFoundException;
import org.bonitasoft.engine.session.impl.APISessionImpl;
import org.bonitasoft.engine.session.model.SSession;
import org.bonitasoft.engine.sessionaccessor.SessionAccessor;
import org.bonitasoft.engine.sessionaccessor.SessionIdNotSetException;
import org.bonitasoft.engine.supervisor.mapping.model.SProcessSupervisor;

/**
 * @author Matthieu Chaffotte
 * @author Yanyan Liu
 * @author Celine Souchet
 */
public class ModelConvertor {

    public static APISession toAPISession(final SSession session, final String tenant) {
        final long tenantId = session.getTenantId();
        final long id = session.getId();
        final long userId = session.getUserId();
        final String userName = session.getUserName();
        final Date creationDate = session.getCreationDate();
        final long duration = session.getDuration();
        final boolean technicalUser = session.isTechnicalUser();
        final APISessionImpl apiSession = new APISessionImpl(id, creationDate, duration, userName, userId, tenant, tenantId);
        apiSession.setTechnicalUser(technicalUser);
        return apiSession;
    }

    public static Platform toPlatform(final SPlatform sPlatform) {
        return new PlatformImpl(sPlatform.getVersion(), sPlatform.getPreviousVersion(), sPlatform.getInitialVersion(), sPlatform.getCreatedBy(),
                sPlatform.getCreated());
    }

    public static List toActivityInstances(final List sActivities, final FlowNodeStateManager flowNodeStateManager) {
        final List activityInstances = new ArrayList();
        for (final SActivityInstance sActivity : sActivities) {
            final ActivityInstance activityInstance = toActivityInstance(sActivity, flowNodeStateManager);
            activityInstances.add(activityInstance);
        }
        return activityInstances;
    }

    public static List toFlowNodeInstances(final List sFlowNodes, final FlowNodeStateManager flowNodeStateManager) {
        final List flowNodeInstances = new ArrayList();
        for (final SFlowNodeInstance sFlowNode : sFlowNodes) {
            final FlowNodeInstance flowNodeInstance = toFlowNodeInstance(sFlowNode, flowNodeStateManager);
            flowNodeInstances.add(flowNodeInstance);
        }
        return flowNodeInstances;
    }

    private static void updateFlowNode(final FlowNodeInstanceImpl flowNode, final SFlowNodeInstance sflowNode, final String state) {
        flowNode.setId(sflowNode.getId());
        flowNode.setState(state);
        flowNode.setParentContainerId(sflowNode.getParentContainerId());
        flowNode.setRootContainerId(sflowNode.getRootContainerId());
        flowNode.setProcessDefinitionId(sflowNode.getLogicalGroup(0));
        flowNode.setParentProcessInstanceId(sflowNode.getLogicalGroup(3));
        flowNode.setDisplayName(sflowNode.getDisplayName());
        flowNode.setDisplayDescription(sflowNode.getDisplayDescription());
        flowNode.setDescription(sflowNode.getDescription());
        flowNode.setExecutedBy(sflowNode.getExecutedBy());
        flowNode.setStateCategory(StateCategory.valueOf(sflowNode.getStateCategory().name()));
    }

    public static ActivityInstance toActivityInstance(final SActivityInstance sActivity, final FlowNodeStateManager flowNodeStateManager) {
        switch (sActivity.getType()) {
            case AUTOMATIC_TASK:
                return toAutomaticTask((SAutomaticTaskInstance) sActivity, flowNodeStateManager);
            case MANUAL_TASK:
                return toManualTask((SManualTaskInstance) sActivity, flowNodeStateManager);
            case USER_TASK:
                return toUserTaskInstance((SUserTaskInstance) sActivity, flowNodeStateManager);
            case RECEIVE_TASK:
                return toReceiveTaskInstance((SReceiveTaskInstance) sActivity, flowNodeStateManager);
            case SEND_TASK:
                return toSendTaskInstance((SSendTaskInstance) sActivity, flowNodeStateManager);
            case CALL_ACTIVITY:
                return toCallActivityInstance((SCallActivityInstance) sActivity, flowNodeStateManager);
            case SUB_PROCESS:
                return toSubProcessActivityInstance((SSubProcessActivityInstance) sActivity, flowNodeStateManager);
            case LOOP_ACTIVITY:
                return toLoopActivityInstance((SLoopActivityInstance) sActivity, flowNodeStateManager);
            case MULTI_INSTANCE_ACTIVITY:
                return toMultiInstanceActivityInstance((SMultiInstanceActivityInstance) sActivity, flowNodeStateManager);
            default:
                throw new UnknownElementType(sActivity.getType().name());
        }
    }

    public static FlowNodeInstance toFlowNodeInstance(final SFlowNodeInstance sFlowNode, final FlowNodeStateManager flowNodeStateManager) {
        switch (sFlowNode.getType()) {
            case START_EVENT:
                return toEventInstance((SEventInstance) sFlowNode, flowNodeStateManager);
            case INTERMEDIATE_CATCH_EVENT:
                return toEventInstance((SEventInstance) sFlowNode, flowNodeStateManager);
            case BOUNDARY_EVENT:
                return toEventInstance((SEventInstance) sFlowNode, flowNodeStateManager);
            case INTERMEDIATE_THROW_EVENT:
                return toEventInstance((SEventInstance) sFlowNode, flowNodeStateManager);
            case END_EVENT:
                return toEventInstance((SEventInstance) sFlowNode, flowNodeStateManager);
            case GATEWAY:
                return toGatewayInstance((SGatewayInstance) sFlowNode, flowNodeStateManager);
            default:
                if (sFlowNode instanceof SActivityInstance) {
                    return toActivityInstance((SActivityInstance) sFlowNode, flowNodeStateManager);
                }
                throw new UnknownElementType(sFlowNode.getType().name());
        }
    }

    public static ActivityInstance toAutomaticTask(final SAutomaticTaskInstance sActivity, final FlowNodeStateManager flowNodeStateManager) {
        final AutomaticTaskInstanceImpl automaticTaskInstance = new AutomaticTaskInstanceImpl(sActivity.getName(), sActivity.getFlowNodeDefinitionId());
        updateActivityInstance(sActivity, flowNodeStateManager, automaticTaskInstance);
        return automaticTaskInstance;
    }

    public static ActivityInstance toCallActivityInstance(final SCallActivityInstance sActivity, final FlowNodeStateManager flowNodeStateManager) {
        final CallActivityInstanceImpl callActivityInstance = new CallActivityInstanceImpl(sActivity.getName(), sActivity.getFlowNodeDefinitionId());
        updateActivityInstance(sActivity, flowNodeStateManager, callActivityInstance);
        return callActivityInstance;
    }

    public static ActivityInstance toCallActivityInstance(final SSubProcessActivityInstance sActivity, final FlowNodeStateManager flowNodeStateManager) {
        final SubProcessActivityInstanceImpl subProcActivityInstance = new SubProcessActivityInstanceImpl(sActivity.getName(),
                sActivity.getFlowNodeDefinitionId(), sActivity.isTriggeredByEvent());
        updateActivityInstance(sActivity, flowNodeStateManager, subProcActivityInstance);
        return subProcActivityInstance;
    }

    public static ActivityInstance toSubProcessActivityInstance(final SSubProcessActivityInstance sActivity, final FlowNodeStateManager flowNodeStateManager) {
        final SubProcessActivityInstanceImpl subProcessActivityInstance = new SubProcessActivityInstanceImpl(sActivity.getName(),
                sActivity.getFlowNodeDefinitionId(), sActivity.isTriggeredByEvent());
        updateActivityInstance(sActivity, flowNodeStateManager, subProcessActivityInstance);
        return subProcessActivityInstance;
    }

    public static ActivityInstance toLoopActivityInstance(final SLoopActivityInstance sActivity, final FlowNodeStateManager flowNodeStateManager) {
        final LoopActivityInstanceImpl loopActivityInstance = new LoopActivityInstanceImpl(sActivity.getName(), sActivity.getFlowNodeDefinitionId(),
                sActivity.getLoopCounter());
        updateActivityInstance(sActivity, flowNodeStateManager, loopActivityInstance);
        return loopActivityInstance;
    }

    public static ActivityInstance toMultiInstanceActivityInstance(final SMultiInstanceActivityInstance sActivity,
            final FlowNodeStateManager flowNodeStateManager) {
        final MultiInstanceActivityInstanceImpl loopActivityInstance = new MultiInstanceActivityInstanceImpl(sActivity.getName(),
                sActivity.getFlowNodeDefinitionId(), sActivity.isSequential(), sActivity.getLoopDataInputRef(), sActivity.getLoopDataOutputRef(),
                sActivity.getDataInputItemRef(), sActivity.getDataOutputItemRef(), sActivity.getNumberOfActiveInstances(),
                sActivity.getNumberOfCompletedInstances(), sActivity.getNumberOfTerminatedInstances(), sActivity.getLoopCardinality());
        updateActivityInstance(sActivity, flowNodeStateManager, loopActivityInstance);
        return loopActivityInstance;
    }

    public static GatewayInstance toGatewayInstance(final SGatewayInstance sGatewayInstance, final FlowNodeStateManager flowNodeStateManager) {
        final GatewayInstanceImpl gatewayInstance = new GatewayInstanceImpl(sGatewayInstance.getName(), sGatewayInstance.getFlowNodeDefinitionId());
        final String state = flowNodeStateManager.getState(sGatewayInstance.getStateId()).getName();
        updateFlowNode(gatewayInstance, sGatewayInstance, state);
        return gatewayInstance;
    }

    public static ArchivedGatewayInstance toArchivedGatewayInstance(final SAGatewayInstance saGatewayInstance, final FlowNodeStateManager flowNodeStateManager) {
        final String name = saGatewayInstance.getName();
        final ArchivedGatewayInstanceImpl aGatewayInstance = new ArchivedGatewayInstanceImpl(name);
        final String state = flowNodeStateManager.getState(saGatewayInstance.getStateId()).getName();
        updateArchivedFlowNodeInstance(aGatewayInstance, saGatewayInstance, state);
        return aGatewayInstance;
    }

    private static void updateActivityInstance(final SActivityInstance sActivity, final FlowNodeStateManager flowNodeStateManager,
            final ActivityInstanceImpl activity) {
        final String state = flowNodeStateManager.getState(sActivity.getStateId()).getName();
        updateFlowNode(activity, sActivity, state);
        activity.setReachedSateDate(new Date(sActivity.getReachedStateDate()));
        activity.setLastUpdateDate(new Date(sActivity.getLastUpdateDate()));
    }

    public static List toUserTaskInstances(final List sUserTasks, final FlowNodeStateManager flowNodeStateManager) {
        final List userTaskInstances = new ArrayList();
        for (final SUserTaskInstance sUserTask : sUserTasks) {
            final UserTaskInstance userTask = toUserTaskInstance(sUserTask, flowNodeStateManager);
            userTaskInstances.add(userTask);
        }
        return userTaskInstances;
    }

    public static UserTaskInstance toUserTaskInstance(final SUserTaskInstance sUserTask, final FlowNodeStateManager flowNodeStateManager) {
        final UserTaskInstanceImpl userTaskInstance = new UserTaskInstanceImpl(sUserTask.getName(), sUserTask.getFlowNodeDefinitionId(), sUserTask.getActorId());
        updateHumanTaskInstance(sUserTask, flowNodeStateManager, userTaskInstance);
        return userTaskInstance;
    }

    public static ActivityInstance toReceiveTaskInstance(final SReceiveTaskInstance sReceiveTask, final FlowNodeStateManager flowNodeStateManager) {
        final ReceiveTaskInstanceImpl receiveTaskInstance = new ReceiveTaskInstanceImpl(sReceiveTask.getName(), sReceiveTask.getFlowNodeDefinitionId());
        updateActivityInstance(sReceiveTask, flowNodeStateManager, receiveTaskInstance);
        return receiveTaskInstance;
    }

    public static ActivityInstance toSendTaskInstance(final SSendTaskInstance sSendTask, final FlowNodeStateManager flowNodeStateManager) {
        final SendTaskInstanceImpl sendTask = new SendTaskInstanceImpl(sSendTask.getName(), sSendTask.getFlowNodeDefinitionId());
        updateActivityInstance(sSendTask, flowNodeStateManager, sendTask);
        return sendTask;
    }

    private static void updateHumanTaskInstance(final SHumanTaskInstance sHumanTask, final FlowNodeStateManager flowNodeStateManager,
            final HumanTaskInstanceImpl humanTaskInstance) {
        updateActivityInstance(sHumanTask, flowNodeStateManager, humanTaskInstance);
        humanTaskInstance.setAssigneeId(sHumanTask.getAssigneeId());
        final long claimedDate = sHumanTask.getClaimedDate();
        if (claimedDate > 0) {
            humanTaskInstance.setClaimedDate(new Date(claimedDate));
        }
        humanTaskInstance.setPriority(TaskPriority.valueOf(sHumanTask.getPriority().name()));
        final long expectedEndDate = sHumanTask.getExpectedEndDate();
        if (expectedEndDate > 0) {
            humanTaskInstance.setExpectedEndDate(new Date(expectedEndDate));
        }
    }

    public static List toHumanTaskInstances(final List sHumanTasks,
            final FlowNodeStateManager flowNodeStateManager) {
        final List humanTaskInstances = new ArrayList(sHumanTasks.size());
        for (final SHumanTaskInstance sUserTask : sHumanTasks) {
            final HumanTaskInstance userTask = toHumanTaskInstance(sUserTask, flowNodeStateManager);
            humanTaskInstances.add(userTask);
        }
        return humanTaskInstances;
    }

    public static HumanTaskInstance toHumanTaskInstance(final SHumanTaskInstance sHumanTask, final FlowNodeStateManager flowNodeStateManager) {
        switch (sHumanTask.getType()) {
            case USER_TASK:
                return toUserTaskInstance((SUserTaskInstance) sHumanTask, flowNodeStateManager);
            case MANUAL_TASK:
                return toManualTask((SManualTaskInstance) sHumanTask, flowNodeStateManager);
            default:
                throw new UnknownElementType(sHumanTask.getType().name());
        }
    }

    public static ManualTaskInstance toManualTask(final SManualTaskInstance sHumanTask, final FlowNodeStateManager flowNodeStateManager) {
        final ManualTaskInstanceImpl manualTaskInstance = new ManualTaskInstanceImpl(sHumanTask.getName(), sHumanTask.getFlowNodeDefinitionId(),
                sHumanTask.getActorId());
        updateHumanTaskInstance(sHumanTask, flowNodeStateManager, manualTaskInstance);
        return manualTaskInstance;
    }

    public static ProcessDefinition toProcessDefinition(final SProcessDefinition sDefinition) {
        final ProcessDefinitionImpl processDefinitionImpl = new ProcessDefinitionImpl(sDefinition.getName(), sDefinition.getVersion());
        processDefinitionImpl.setId(sDefinition.getId());
        processDefinitionImpl.setDescription(sDefinition.getDescription());
        return processDefinitionImpl;
    }

    public static List toProcessInstances(final List sProcessInstances,
            final ProcessDefinitionService processDefinitionService) {
        final List clientProcessInstances = new ArrayList();
        final HashMap processDefinitions = new HashMap();
        if (sProcessInstances != null) {
            for (final SProcessInstance sProcessInstance : sProcessInstances) {
                SProcessDefinition sProcessDefinition = processDefinitions.get(sProcessInstance.getProcessDefinitionId());
                if (sProcessDefinition == null) {
                    try {
                        sProcessDefinition = processDefinitionService.getProcessDefinition(sProcessInstance.getProcessDefinitionId());
                        processDefinitions.put(sProcessDefinition.getId(), sProcessDefinition);
                    } catch (final SProcessDefinitionNotFoundException e) {
                        // ignore...
                    } catch (final SProcessDefinitionReadException e) {
                        // ignore...
                    }
                }
                clientProcessInstances.add(toProcessInstance(sProcessDefinition, sProcessInstance));
            }
        }
        return Collections.unmodifiableList(clientProcessInstances);
    }

    public static ProcessInstance toProcessInstance(final SProcessDefinition definition, final SProcessInstance sInstance) {
        final ProcessInstanceBuilder clientProcessInstanceBuilder = new ProcessInstanceBuilder().createNewInstance(sInstance.getName());
        clientProcessInstanceBuilder.setId(sInstance.getId());

        clientProcessInstanceBuilder.setState(ProcessInstanceState.getFromId(sInstance.getStateId()).name().toLowerCase());
        if (sInstance.getStartDate() > 0) {
            clientProcessInstanceBuilder.setStartDate(sInstance.getStartDate());
        }
        clientProcessInstanceBuilder.setStartedBy(sInstance.getStartedBy());
        if (sInstance.getEndDate() > 0) {
            clientProcessInstanceBuilder.setEndDate(sInstance.getEndDate());
        }
        clientProcessInstanceBuilder.setLastUpdate(sInstance.getLastUpdate());
        clientProcessInstanceBuilder.setProcessDefinitionId(sInstance.getProcessDefinitionId());
        clientProcessInstanceBuilder.setDescription(sInstance.getDescription());
        clientProcessInstanceBuilder.setRootProcessInstanceId(sInstance.getRootProcessInstanceId());
        clientProcessInstanceBuilder.setCallerId(sInstance.getCallerId());

        if (definition != null) {
            for (int i = 1; i <= 5; i++) {
                clientProcessInstanceBuilder.setStringIndexLabel(i, definition.getStringIndexLabel(i));
            }
        }
        clientProcessInstanceBuilder.setStringIndex1(sInstance.getStringIndex1());
        clientProcessInstanceBuilder.setStringIndex2(sInstance.getStringIndex2());
        clientProcessInstanceBuilder.setStringIndex3(sInstance.getStringIndex3());
        clientProcessInstanceBuilder.setStringIndex4(sInstance.getStringIndex4());
        clientProcessInstanceBuilder.setStringIndex5(sInstance.getStringIndex5());
        return clientProcessInstanceBuilder.done();
    }

    public static List toProcessDeploymentInfo(final List processDefinitionDIs) {
        final List deploymentInfos = new ArrayList();
        for (final SProcessDefinitionDeployInfo processDefinitionDI : processDefinitionDIs) {
            final ProcessDeploymentInfo deploymentInfo = toProcessDeploymentInfo(processDefinitionDI);
            deploymentInfos.add(deploymentInfo);
        }
        return deploymentInfos;
    }

    public static ProcessDeploymentInfo toProcessDeploymentInfo(final SProcessDefinitionDeployInfo processDefinitionDI) {
        return new ProcessDeploymentInfoImpl(processDefinitionDI.getId(), processDefinitionDI.getProcessId(), processDefinitionDI.getName(),
                processDefinitionDI.getVersion(), processDefinitionDI.getDescription(), new Date(processDefinitionDI.getDeploymentDate()),
                processDefinitionDI.getDeployedBy(), ActivationState.valueOf(processDefinitionDI.getActivationState()),
                ConfigurationState.valueOf(processDefinitionDI.getConfigurationState()), processDefinitionDI.getDisplayName(), new Date(
                        processDefinitionDI.getLastUpdateDate()), processDefinitionDI.getIconPath(), processDefinitionDI.getDisplayDescription());
    }

    public static ArchivedUserTaskInstance toArchivedUserTaskInstance(final SAUserTaskInstance sInstance, final FlowNodeStateManager flowNodeStateManager) {
        final ArchivedUserTaskInstanceImpl archivedUserTaskInstanceImpl = new ArchivedUserTaskInstanceImpl(sInstance.getName());
        updateArchivedHumanTaskInstance(archivedUserTaskInstanceImpl, flowNodeStateManager, sInstance);
        return archivedUserTaskInstanceImpl;
    }

    public static ArchivedReceiveTaskInstance toArchivedReceiveTaskInstance(final SAReceiveTaskInstance sInstance,
            final FlowNodeStateManager flowNodeStateManager) {
        final ArchivedReceiveTaskInstanceImpl archivedReceiveTaskInstanceImpl = new ArchivedReceiveTaskInstanceImpl(sInstance.getName());
        updateArchivedReceiveTaskInstance(archivedReceiveTaskInstanceImpl, flowNodeStateManager, sInstance);
        return archivedReceiveTaskInstanceImpl;
    }

    public static ArchivedSendTaskInstance toArchivedSendTaskInstance(final SASendTaskInstance sInstance, final FlowNodeStateManager flowNodeStateManager) {
        final ArchivedSendTaskInstanceImpl archivedSendTaskInstanceImpl = new ArchivedSendTaskInstanceImpl(sInstance.getName());
        updateArchivedSendTaskInstance(archivedSendTaskInstanceImpl, flowNodeStateManager, sInstance);
        return archivedSendTaskInstanceImpl;
    }

    /**
     * Update the fields of ArchivedHumanTaskInstance from a SAHumanTaskInstance
     */
    private static void updateArchivedHumanTaskInstance(final ArchivedHumanTaskInstanceImpl activity, final FlowNodeStateManager flowNodeStateManager,
            final SAHumanTaskInstance saHumanTask) {
        updateArchivedActivityInstance(activity, flowNodeStateManager, saHumanTask);
        activity.setAssigneeId(saHumanTask.getAssigneeId());
        activity.setPriority(TaskPriority.valueOf(saHumanTask.getPriority().name()));
        activity.setActorId(saHumanTask.getActorId());
        if (saHumanTask.getExpectedEndDate() > 0) {
            activity.setExpectedEndDate(new Date(saHumanTask.getExpectedEndDate()));
        }
    }

    /**
     * Update the fields of ArchivednTaskInstance from a SAActivityInstance
     */
    private static void updateArchivedReceiveTaskInstance(final ArchivedHumanTaskInstanceImpl activity, final FlowNodeStateManager flowNodeStateManager,
            final SAReceiveTaskInstance sActivity) {
        final String state = flowNodeStateManager.getState(sActivity.getStateId()).getName();
        updateArchivedFlowNodeInstance(activity, sActivity, state);
        activity.setReachedStateDate(new Date(sActivity.getReachedStateDate()));
        activity.setLastUpdateDate(new Date(sActivity.getLastUpdateDate()));
    }

    /**
     * Update the fields of ArchivednTaskInstance from a SAActivityInstance
     */
    private static void updateArchivedSendTaskInstance(final ArchivedHumanTaskInstanceImpl activity, final FlowNodeStateManager flowNodeStateManager,
            final SASendTaskInstance sActivity) {
        final String state = flowNodeStateManager.getState(sActivity.getStateId()).getName();
        updateArchivedFlowNodeInstance(activity, sActivity, state);
        activity.setReachedStateDate(new Date(sActivity.getReachedStateDate()));
        activity.setLastUpdateDate(new Date(sActivity.getLastUpdateDate()));
    }

    /**
     * Update the fields of ArchivedActivityInstance from a SAActivityInstance
     */
    private static void updateArchivedActivityInstance(final ArchivedActivityInstanceImpl activity, final FlowNodeStateManager flowNodeStateManager,
            final SAActivityInstance sActivity) {
        final String state = flowNodeStateManager.getState(sActivity.getStateId()).getName();
        updateArchivedFlowNodeInstance(activity, sActivity, state);
        activity.setReachedStateDate(new Date(sActivity.getReachedStateDate()));
        activity.setLastUpdateDate(new Date(sActivity.getLastUpdateDate()));
    }

    private static void updateArchivedFlowNodeInstance(final ArchivedFlowNodeInstanceImpl aFlowNode, final SAFlowNodeInstance saFlowNode, final String state) {
        aFlowNode.setId(saFlowNode.getId());
        aFlowNode.setState(state);
        aFlowNode.setParentContainerId(saFlowNode.getParentContainerId());
        aFlowNode.setRootContainerId(saFlowNode.getRootContainerId());
        aFlowNode.setSourceObjectId(saFlowNode.getSourceObjectId());
        aFlowNode.setProcessDefinitionId(saFlowNode.getLogicalGroup(0));
        aFlowNode.setProcessInstanceId(saFlowNode.getLogicalGroup(1));
        aFlowNode.setDescription(saFlowNode.getDescription());
        aFlowNode.setDisplayName(saFlowNode.getDisplayName());
        aFlowNode.setDisplayDescription(saFlowNode.getDisplayDescription());
        if (saFlowNode.getArchiveDate() > 0) {
            aFlowNode.setArchiveDate(new Date(saFlowNode.getArchiveDate()));
        }
        aFlowNode.setExecutedBy(saFlowNode.getExecutedBy());
        aFlowNode.setFlownodeDefinitionId(saFlowNode.getFlownodeDefinitionId());
        aFlowNode.setTerminal(saFlowNode.isTerminal());
    }

    public static List toArchivedUserTaskInstances(final List sInstances,
            final FlowNodeStateManager flowNodeStateManager) {
        final List archivedUserTaskInstances = new ArrayList();
        for (final SAUserTaskInstance sAUserTaskInstance : sInstances) {
            final ArchivedUserTaskInstance archivedUserTaskInstance = toArchivedUserTaskInstance(sAUserTaskInstance, flowNodeStateManager);
            archivedUserTaskInstances.add(archivedUserTaskInstance);
        }
        return archivedUserTaskInstances;
    }

    public static List toArchivedReceiveTaskInstances(final List sInstances,
            final FlowNodeStateManager flowNodeStateManager) {
        final List archivedReceiveTaskInstances = new ArrayList();
        for (final SAReceiveTaskInstance sAReceiveTaskInstance : sInstances) {
            final ArchivedReceiveTaskInstance archivedReceiveTaskInstance = toArchivedReceiveTaskInstance(sAReceiveTaskInstance, flowNodeStateManager);
            archivedReceiveTaskInstances.add(archivedReceiveTaskInstance);
        }
        return archivedReceiveTaskInstances;
    }

    public static List toArchivedHumanTaskInstances(final List sInstances,
            final FlowNodeStateManager flowNodeStateManager) {
        final List archivedUserTaskInstances = new ArrayList();
        for (final SAHumanTaskInstance sInstance : sInstances) {
            final ArchivedHumanTaskInstance archivedUserTaskInstance = toArchivedHumanTaskInstance(sInstance, flowNodeStateManager);
            archivedUserTaskInstances.add(archivedUserTaskInstance);
        }
        return archivedUserTaskInstances;
    }

    public static ArchivedHumanTaskInstance toArchivedHumanTaskInstance(final SAHumanTaskInstance sInstance, final FlowNodeStateManager flowNodeStateManager) {
        switch (sInstance.getType()) {
            case MANUAL_TASK:
                return toArchivedManualTaskInstance((SAManualTaskInstance) sInstance, flowNodeStateManager);
            case USER_TASK:
                return toArchivedUserTaskInstance((SAUserTaskInstance) sInstance, flowNodeStateManager);
            default:
                throw new UnknownElementType(sInstance.getType().name());
        }
    }

    public static ArchivedActivityInstance toArchivedActivityInstance(final SAActivityInstance sInstance, final FlowNodeStateManager flowNodeStateManager) {
        switch (sInstance.getType()) {
            case AUTOMATIC_TASK:
                return toArchivedAutomaticTaskInstance(sInstance, flowNodeStateManager);
            case MANUAL_TASK:
                return toArchivedManualTaskInstance((SAManualTaskInstance) sInstance, flowNodeStateManager);
            case USER_TASK:
                return toArchivedUserTaskInstance((SAUserTaskInstance) sInstance, flowNodeStateManager);
            case RECEIVE_TASK:
                return toArchivedReceiveTaskInstance((SAReceiveTaskInstance) sInstance, flowNodeStateManager);
            case SEND_TASK:
                return toArchivedSendTaskInstance((SASendTaskInstance) sInstance, flowNodeStateManager);
            case LOOP_ACTIVITY:
                return toArchivedLoopActivityInstance((SALoopActivityInstance) sInstance, flowNodeStateManager);
            case CALL_ACTIVITY:
                return toArchivedCallActivityInstance((SACallActivityInstance) sInstance, flowNodeStateManager);
            case SUB_PROCESS:
                return toArchivedSubProcessActivityInstance((SASubProcessActivityInstance) sInstance, flowNodeStateManager);
            case MULTI_INSTANCE_ACTIVITY:
                return toArchivedMultiInstanceActivityInstance((SAMultiInstanceActivityInstance) sInstance, flowNodeStateManager);
            case BOUNDARY_EVENT:
            case END_EVENT:
            case GATEWAY:
            case INTERMEDIATE_CATCH_EVENT:
            case INTERMEDIATE_THROW_EVENT:
            case START_EVENT:
                throw new UnknownElementType("Events are not yet archived");
            default:
                throw new UnknownElementType(sInstance.getType().name());
        }
    }

    private static ArchivedLoopActivityInstance toArchivedLoopActivityInstance(final SALoopActivityInstance sInstance,
            final FlowNodeStateManager flowNodeStateManager) {
        final ArchivedLoopActivityInstanceImpl archivedloopActivityInstanceImpl = new ArchivedLoopActivityInstanceImpl(sInstance.getName());
        archivedloopActivityInstanceImpl.setLoopCounter(sInstance.getLoopCounter());
        archivedloopActivityInstanceImpl.setLoopMax(sInstance.getLoopMax());
        updateArchivedActivityInstance(archivedloopActivityInstanceImpl, flowNodeStateManager, sInstance);
        return archivedloopActivityInstanceImpl;
    }

    private static ArchivedMultiInstanceActivityInstanceImpl toArchivedMultiInstanceActivityInstance(final SAMultiInstanceActivityInstance sInstance,
            final FlowNodeStateManager flowNodeStateManager) {
        final ArchivedMultiInstanceActivityInstanceImpl archivedMultiInstanceActivityInstanceImpl = new ArchivedMultiInstanceActivityInstanceImpl(
                sInstance.getName(), sInstance.getFlownodeDefinitionId(), sInstance.isSequential(), sInstance.getLoopDataInputRef(),
                sInstance.getLoopDataOutputRef(), sInstance.getDataInputItemRef(), sInstance.getDataOutputItemRef(), sInstance.getNumberOfActiveInstances(),
                sInstance.getNumberOfCompletedInstances(), sInstance.getNumberOfTerminatedInstances(), sInstance.getLoopCardinality());
        updateArchivedActivityInstance(archivedMultiInstanceActivityInstanceImpl, flowNodeStateManager, sInstance);
        return archivedMultiInstanceActivityInstanceImpl;
    }

    public static ArchivedManualTaskInstance toArchivedManualTaskInstance(final SAManualTaskInstance sInstance, final FlowNodeStateManager flowNodeStateManager) {
        final ArchivedManualTaskInstanceImpl archivedUserTaskInstanceImpl = new ArchivedManualTaskInstanceImpl(sInstance.getName());
        updateArchivedHumanTaskInstance(archivedUserTaskInstanceImpl, flowNodeStateManager, sInstance);
        return archivedUserTaskInstanceImpl;
    }

    public static ArchivedCallActivityInstance toArchivedCallActivityInstance(final SACallActivityInstance sInstance,
            final FlowNodeStateManager flowNodeStateManager) {
        final ArchivedCallActivityInstanceImpl archivedCallActivityInstanceImpl = new ArchivedCallActivityInstanceImpl(sInstance.getName());
        updateArchivedActivityInstance(archivedCallActivityInstanceImpl, flowNodeStateManager, sInstance);
        return archivedCallActivityInstanceImpl;
    }

    public static ArchivedSubProcessActivityInstance toArchivedSubProcessActivityInstance(final SASubProcessActivityInstance sInstance,
            final FlowNodeStateManager flowNodeStateManager) {
        final ArchivedSubProcessActivityInstanceImpl archivedSubProcActivityInstanceImpl = new ArchivedSubProcessActivityInstanceImpl(sInstance.getName(),
                sInstance.isTriggeredByEvent());
        updateArchivedActivityInstance(archivedSubProcActivityInstanceImpl, flowNodeStateManager, sInstance);
        return archivedSubProcActivityInstanceImpl;
    }

    public static ArchivedAutomaticTaskInstance toArchivedAutomaticTaskInstance(final SAActivityInstance sInstance,
            final FlowNodeStateManager flowNodeStateManager) {
        final ArchivedAutomaticTaskInstanceImpl archivedUserTaskInstanceImpl = new ArchivedAutomaticTaskInstanceImpl(sInstance.getName());
        updateArchivedActivityInstance(archivedUserTaskInstanceImpl, flowNodeStateManager, sInstance);
        return archivedUserTaskInstanceImpl;
    }

    public static List toArchivedActivityInstances(final List saActivityInstances,
            final FlowNodeStateManager flowNodeStateManager) {
        final List archivedActivityInstances = new ArrayList();
        for (final SAActivityInstance saActivityInstance : saActivityInstances) {
            final ArchivedActivityInstance archivedActivityInstance = toArchivedActivityInstance(saActivityInstance, flowNodeStateManager);
            archivedActivityInstances.add(archivedActivityInstance);
        }
        return archivedActivityInstances;
    }

    public static List toArchivedProcessInstances(final List sProcessInstances) {
        final List clientProcessInstances = new ArrayList(sProcessInstances.size());
        for (final SAProcessInstance sProcessInstance : sProcessInstances) {
            clientProcessInstances.add(toArchivedProcessInstance(sProcessInstance));
        }
        return Collections.unmodifiableList(clientProcessInstances);
    }

    public static ArchivedProcessInstance toArchivedProcessInstance(final SAProcessInstance sInstance) {
        final ArchivedProcessInstanceImpl archivedInstance = new ArchivedProcessInstanceImpl(sInstance.getName());
        archivedInstance.setId(sInstance.getId());
        final int stateId = sInstance.getStateId();
        archivedInstance.setStateId(stateId);
        archivedInstance.setState(ProcessInstanceState.getFromId(stateId).name().toLowerCase());
        if (sInstance.getStartDate() > 0) {
            archivedInstance.setStartDate(new Date(sInstance.getStartDate()));
        }
        archivedInstance.setStartedBy(sInstance.getStartedBy());
        if (sInstance.getEndDate() > 0) {
            archivedInstance.setEndDate(new Date(sInstance.getEndDate()));
        }
        if (sInstance.getArchiveDate() > 0) {
            archivedInstance.setArchiveDate(new Date(sInstance.getArchiveDate()));
        }
        if (sInstance.getLastUpdate() > 0) {
            archivedInstance.setLastUpdate(new Date(sInstance.getLastUpdate()));
        }
        archivedInstance.setProcessDefinitionId(sInstance.getProcessDefinitionId());
        archivedInstance.setDescription(sInstance.getDescription());
        archivedInstance.setSourceObjectId(sInstance.getSourceObjectId());
        archivedInstance.setRootProcessInstanceId(sInstance.getRootProcessInstanceId());
        archivedInstance.setCallerId(sInstance.getCallerId());
        return archivedInstance;
    }

    public static List toGroups(final List sGroups) {
        final List clientGroups = new ArrayList();
        if (sGroups != null) {
            for (final SGroup sGroup : sGroups) {
                clientGroups.add(toGroup(sGroup));
            }
        }
        return Collections.unmodifiableList(clientGroups);
    }

    public static Group toGroup(final SGroup sGroup) {
        final GroupImpl group = new GroupImpl(sGroup.getId(), sGroup.getName());
        group.setParentPath(sGroup.getParentPath());
        group.setCreatedBy(sGroup.getCreatedBy());
        group.setCreationDate(new Date(sGroup.getCreationDate()));
        group.setDescription(sGroup.getDescription());
        group.setDisplayName(sGroup.getDisplayName());
        group.setIconName(sGroup.getIconName());
        group.setIconPath(sGroup.getIconPath());
        group.setLastUpdate(new Date(sGroup.getLastUpdate()));
        return group;
    }

    public static User toUser(final SUser sUser) {
        return toUser(sUser, null);
    }

    public static User toUser(final SUser sUser, final Map userIdToUser) {
        final UserImpl user = new UserImpl(sUser.getId(), sUser.getUserName(), sUser.getPassword());
        user.setFirstName(sUser.getFirstName());
        user.setLastName(sUser.getLastName());
        user.setTitle(sUser.getTitle());
        user.setJobTitle(sUser.getJobTitle());
        user.setCreatedBy(sUser.getCreatedBy());
        user.setCreationDate(new Date(sUser.getCreationDate()));
        user.setIconName(sUser.getIconName());
        user.setIconPath(sUser.getIconPath());
        user.setLastUpdate(new Date(sUser.getLastUpdate()));
        user.setEnabled(sUser.isEnabled());
        final long managerUserId = sUser.getManagerUserId();
        user.setManagerUserId(managerUserId);
        if (managerUserId > 0 && userIdToUser != null) {
            user.setManagerUserName(userIdToUser.get(managerUserId).getUserName());
        }
        if (sUser.getLastConnection() != null) {
            user.setLastConnection(new Date(sUser.getLastConnection()));
        }
        return user;
    }

    public static ContactData toUserContactData(final SContactInfo sContactData) {
        final ContactDataImpl contactData = new ContactDataImpl(sContactData.getUserId());
        contactData.setAddress(sContactData.getAddress());
        contactData.setBuilding(sContactData.getBuilding());
        contactData.setCity(sContactData.getCity());
        contactData.setCountry(sContactData.getCountry());
        contactData.setEmail(sContactData.getEmail());
        contactData.setFaxNumber(sContactData.getFaxNumber());
        contactData.setMobileNumber(sContactData.getMobileNumber());
        contactData.setPersonal(sContactData.isPersonal());
        contactData.setPhoneNumber(sContactData.getPhoneNumber());
        contactData.setRoom(sContactData.getRoom());
        contactData.setState(sContactData.getState());
        contactData.setWebsite(sContactData.getWebsite());
        contactData.setZipCode(sContactData.getZipCode());
        return contactData;
    }

    public static List toUsers(final List sUsers, final Map userIdToUser) {
        final List users = new ArrayList();
        if (sUsers != null) {
            for (final SUser sUser : sUsers) {
                final User user = ModelConvertor.toUser(sUser, userIdToUser);
                users.add(user);
            }
        }
        return Collections.unmodifiableList(users);
    }

    public static List toUsers(final List sUsers) {
        return toUsers(sUsers, null);
    }

    public static Role toRole(final SRole sRole) {
        final RoleImpl role = new RoleImpl(sRole.getId(), sRole.getName());
        role.setDisplayName(sRole.getDisplayName());
        role.setDescription(sRole.getDescription());
        role.setIconName(sRole.getIconName());
        role.setIconPath(sRole.getIconPath());
        role.setCreatedBy(sRole.getCreatedBy());
        role.setCreationDate(new Date(sRole.getCreationDate()));
        role.setLastUpdate(new Date(sRole.getLastUpdate()));
        return role;
    }

    public static List toRoles(final List sRoles) {
        final List lightRoles = new ArrayList();
        if (sRoles != null) {
            for (final SRole sRole : sRoles) {
                final Role role = toRole(sRole);
                lightRoles.add(role);
            }
        }
        return Collections.unmodifiableList(lightRoles);
    }

    public static UserMembership toUserMembership(final SUserMembership sUserMembership) {
        final UserMembershipImpl userMembership = new UserMembershipImpl(sUserMembership.getId(), sUserMembership.getUserId(), sUserMembership.getGroupId(),
                sUserMembership.getRoleId());
        userMembership.setAssignedBy(sUserMembership.getAssignedBy());
        userMembership.setAssignedDate(new Date(sUserMembership.getAssignedDate()));
        userMembership.setGroupName(sUserMembership.getGroupName());
        userMembership.setRoleName(sUserMembership.getRoleName());
        userMembership.setUsername(sUserMembership.getUsername());
        return userMembership;
    }

    public static List toUserMembership(final List sUserMemberships) {
        final List userMemberships = new ArrayList();
        if (sUserMemberships != null) {
            for (final SUserMembership sMembership : sUserMemberships) {
                final UserMembership userMembership = toUserMembership(sMembership);
                userMemberships.add(userMembership);
            }
        }
        return Collections.unmodifiableList(userMemberships);
    }

    public static List toUserMembership(final List sUserMemberships, final Map userNames,
            final Map groupIdToGroup) {
        final List userMemberships = new ArrayList();
        if (sUserMemberships != null) {
            for (final SUserMembership sMembership : sUserMemberships) {
                final UserMembership userMembership = toUserMembership(sMembership, userNames, groupIdToGroup);
                userMemberships.add(userMembership);
            }
        }
        return Collections.unmodifiableList(userMemberships);
    }

    private static UserMembership toUserMembership(final SUserMembership sUserMembership, final Map userNames,
            final Map groupIdToGroup) {
        final UserMembershipImpl userMembership = new UserMembershipImpl(sUserMembership.getId(), sUserMembership.getUserId(), sUserMembership.getGroupId(),
                sUserMembership.getRoleId());
        userMembership.setGroupName(sUserMembership.getGroupName());
        userMembership.setGroupParentPath(groupIdToGroup.get(sUserMembership.getGroupId()));
        userMembership.setRoleName(sUserMembership.getRoleName());
        userMembership.setUsername(sUserMembership.getUsername());
        final long assignedBy = sUserMembership.getAssignedBy();
        userMembership.setAssignedBy(assignedBy);
        if (assignedBy > 0) {
            userMembership.setAssignedByName(userNames.get(assignedBy));
        }
        userMembership.setAssignedDate(new Date(sUserMembership.getAssignedDate()));
        return userMembership;
    }

    public static Category toCategory(final SCategory sCategory) {
        final CategoryImpl category = new CategoryImpl(sCategory.getId(), sCategory.getName());
        category.setDescription(sCategory.getDescription());
        category.setCreator(sCategory.getCreator());
        category.setCreationDate(new Date(sCategory.getCreationDate()));
        category.setLastUpdate(new Date(sCategory.getLastUpdateDate()));
        return category;
    }

    public static CommandDescriptor toCommandDescriptor(final SCommand command) {
        final CommandDescriptorImpl commandDescriptor = new CommandDescriptorImpl(command.getName(), command.getDescription(), command.getImplementation());
        commandDescriptor.setId(command.getId());
        commandDescriptor.setSystem(command.getSystem());
        return commandDescriptor;
    }

    public static CommandDescriptor toCommandDescriptor(final SPlatformCommand platformCommand) {
        final CommandDescriptorImpl commandDescriptor = new CommandDescriptorImpl(platformCommand.getName(), platformCommand.getDescription(),
                platformCommand.getImplementation());
        commandDescriptor.setId(platformCommand.getId());
        return commandDescriptor;
    }

    public static List toCommandDescriptors(final List sCommands) {
        if (sCommands != null) {
            final List commandList = new ArrayList();
            for (final SCommand sCommand : sCommands) {
                commandList.add(toCommandDescriptor(sCommand));
            }
            return Collections.unmodifiableList(commandList);
        }
        return Collections.emptyList();
    }

    public static List toPlatformCommandDescriptors(final List sPlatformCommands) {
        if (sPlatformCommands != null) {
            final List platformCommandList = new ArrayList();
            for (final SPlatformCommand sCommand : sPlatformCommands) {
                platformCommandList.add(toCommandDescriptor(sCommand));
            }
            return Collections.unmodifiableList(platformCommandList);
        }
        return Collections.emptyList();
    }

    public static List toCategories(final List sCategories) {
        if (sCategories != null) {
            final List categoryList = new ArrayList();
            for (final SCategory sCategory : sCategories) {
                categoryList.add(toCategory(sCategory));
            }
            return Collections.unmodifiableList(categoryList);
        }
        return Collections.emptyList();
    }

    public static List toEventInstances(final Collection sEvents, final FlowNodeStateManager flowNodeStateManager) {
        final List eventInstances = new ArrayList();
        for (final SEventInstance sEvent : sEvents) {
            final EventInstance eventInstance = toEventInstance(sEvent, flowNodeStateManager);
            eventInstances.add(eventInstance);
        }
        return eventInstances;
    }

    public static EventInstance toEventInstance(final SEventInstance sEvent, final FlowNodeStateManager flowNodeStateManager) {
        final EventInstanceImpl eventInstance = getEventInstance(sEvent);
        updateFlowNode(eventInstance, sEvent, flowNodeStateManager.getState(sEvent.getStateId()).getName());
        return eventInstance;
    }

    public static WaitingEvent toWaitingEvent(final SWaitingEvent sWaitingEvent) {
        WaitingEvent waitingEvent;
        final BPMEventType bpmEventType = BPMEventType.valueOf(sWaitingEvent.getEventType().name());
        final long processDefinitionId = sWaitingEvent.getProcessDefinitionId();
        final String processName = sWaitingEvent.getProcessName();
        final long flowNodeDefinitionId = sWaitingEvent.getFlowNodeDefinitionId();
        switch (sWaitingEvent.getEventTriggerType()) {
            case ERROR:
                final SWaitingErrorEvent sWaitingErrorEvent = (SWaitingErrorEvent) sWaitingEvent;
                waitingEvent = new WaitingErrorEventImpl(bpmEventType, processDefinitionId, processName, flowNodeDefinitionId,
                        sWaitingErrorEvent.getErrorCode());
                break;
            case MESSAGE:
                final SWaitingMessageEvent sWaitingMessageEvent = (SWaitingMessageEvent) sWaitingEvent;
                waitingEvent = new WaitingMessageEventImpl(bpmEventType, processDefinitionId, processName, flowNodeDefinitionId,
                        sWaitingMessageEvent.getMessageName());
                break;
            case SIGNAL:
                final SWaitingSignalEvent sWaitingSignalEvent = (SWaitingSignalEvent) sWaitingEvent;
                waitingEvent = new WaitingSignalEventImpl(bpmEventType, processDefinitionId, processName, flowNodeDefinitionId,
                        sWaitingSignalEvent.getSignalName());
                break;
            default:
                throw new UnknownElementType(sWaitingEvent.getClass().getName());
        }
        return waitingEvent;
    }

    public static List toWaitingEvents(final List sWaitingEvents) {
        final List waitingEvents = new ArrayList(sWaitingEvents.size());
        for (final SWaitingEvent sWaitingEvent : sWaitingEvents) {
            waitingEvents.add(toWaitingEvent(sWaitingEvent));
        }
        return Collections.unmodifiableList(waitingEvents);
    }

    private static EventInstanceImpl getEventInstance(final SEventInstance sEvent) {
        switch (sEvent.getType()) {
            case END_EVENT:
                return new EndEventInstanceImpl(sEvent.getName(), sEvent.getFlowNodeDefinitionId());
            case INTERMEDIATE_CATCH_EVENT:
                return new IntermediateCatchEventInstanceImpl(sEvent.getName(), sEvent.getFlowNodeDefinitionId());
            case INTERMEDIATE_THROW_EVENT:
                return new IntermediateThrowEventInstanceImpl(sEvent.getName(), sEvent.getFlowNodeDefinitionId());
            case BOUNDARY_EVENT:
                return new BoundaryEventInstanceImpl(sEvent.getName(), sEvent.getFlowNodeDefinitionId(),
                        ((SBoundaryEventInstance) sEvent).getActivityInstanceId());
            case START_EVENT:
                return new StartEventInstanceImpl(sEvent.getName(), sEvent.getFlowNodeDefinitionId());
            default:
                throw new UnknownElementType(sEvent.getType().name());
        }
    }

    public static List toDataInstances(final List sDataInstances) {
        if (sDataInstances != null) {
            final List dataInstanceList = new ArrayList();
            for (final SDataInstance sDataInstance : sDataInstances) {
                dataInstanceList.add(toDataInstance(sDataInstance));
            }
            return Collections.unmodifiableList(dataInstanceList);
        }
        return Collections.emptyList();
    }

    public static List toDataDefinitions(final List sDataDefinitions) {
        if (sDataDefinitions != null) {
            final List dataDefinitionList = new ArrayList();
            for (final SDataDefinition sDataDefinition : sDataDefinitions) {
                dataDefinitionList.add(toDataDefinition(sDataDefinition));
            }
            return Collections.unmodifiableList(dataDefinitionList);
        }
        return Collections.emptyList();
    }

    public static DataDefinition toDataDefinition(final SDataDefinition sDataDefinition) {
        DataDefinitionImpl dataDefinitionImpl = null;
        if (sDataDefinition != null) {
            dataDefinitionImpl = new DataDefinitionImpl(sDataDefinition.getName(), toExpression(sDataDefinition.getDefaultValueExpression()));
            dataDefinitionImpl.setClassName(sDataDefinition.getClassName());
            dataDefinitionImpl.setDescription(sDataDefinition.getDescription());
            dataDefinitionImpl.setTransientData(sDataDefinition.isTransientData());
        }
        return dataDefinitionImpl;
    }

    public static List toExpressions(final List sExpressions) {
        if (sExpressions != null && !sExpressions.isEmpty()) {
            final List expList = new ArrayList(sExpressions.size());
            for (final SExpression sexp : sExpressions) {
                expList.add(toExpression(sexp));
            }
            return expList;
        } else {
            return Collections.emptyList();
        }
    }

    public static Expression toExpression(final SExpression sexp) {
        final ExpressionImpl exp = new ExpressionImpl();
        if (sexp != null) {
            exp.setContent(sexp.getContent());
            exp.setExpressionType(sexp.getExpressionType());
            exp.setInterpreter(sexp.getInterpreter());
            exp.setName(sexp.getName());
            exp.setReturnType(sexp.getReturnType());
            exp.setDependencies(toExpressions(sexp.getDependencies()));
        }
        return exp;
    }

    public static DataInstance toDataInstance(final SDataInstance sDataInstance) {
        DataInstanceImpl dataInstance;
        if (sDataInstance.getClassName().equals(Integer.class.getName())) {
            dataInstance = new IntegerDataInstanceImpl();
        } else if (sDataInstance.getClassName().equals(Long.class.getName())) {
            dataInstance = new LongDataInstanceImpl();
        } else if (sDataInstance.getClassName().equals(Boolean.class.getName())) {
            dataInstance = new BooleanDataInstanceImpl();
        } else if (sDataInstance.getClassName().equals(Date.class.getName())) {
            dataInstance = new DateDataInstanceImpl();
        } else if (sDataInstance.getClassName().equals(Double.class.getName())) {
            dataInstance = new DoubleDataInstanceImpl();
        } else if (sDataInstance.getClassName().equals(Float.class.getName())) {
            dataInstance = new FloatDataInstanceImpl();
        } else if (sDataInstance.getClassName().equals(String.class.getName())) {
            dataInstance = new ShortTextDataInstanceImpl();
        } else {
            dataInstance = new BlobDataInstanceImpl();
        }

        dataInstance.setClassName(sDataInstance.getClassName());
        dataInstance.setContainerId(sDataInstance.getContainerId());
        dataInstance.setContainerType(sDataInstance.getContainerType());
        dataInstance.setDataTypeClassName(sDataInstance.getClassName());
        dataInstance.setDescription(sDataInstance.getDescription());
        dataInstance.setId(sDataInstance.getId());
        dataInstance.setName(sDataInstance.getName());
        dataInstance.setValue(sDataInstance.getValue());
        return dataInstance;
    }

    public static ActorMember toActorMember(final SActorMember sActorMember) {
        return new ActorMemberImpl(sActorMember.getId(), sActorMember.getUserId(), sActorMember.getGroupId(), sActorMember.getRoleId());
    }

    public static List toActorMembers(final List sActorMembers) {
        final List actorMembers = new ArrayList();
        for (final SActorMember sActorMember : sActorMembers) {
            final ActorMember actorMember = toActorMember(sActorMember);
            actorMembers.add(actorMember);
        }
        return actorMembers;
    }

    public static ActorInstance toActorInstance(final SActor actor) {
        final String name = actor.getName();
        final String description = actor.getDescription();
        final long scopeId = actor.getScopeId();
        final String displayName = actor.getDisplayName();
        final boolean initiator = actor.isInitiator();
        final ActorInstanceImpl actorInstance = new ActorInstanceImpl(name, description, displayName, scopeId, initiator);
        actorInstance.setId(actor.getId());
        return actorInstance;
    }

    public static SUser constructSUser(final UserCreator creator, final IdentityModelBuilder identityModelBuilder) {
        final long now = System.currentTimeMillis();
        final SUserBuilder userBuilder = identityModelBuilder.getUserBuilder().createNewInstance();
        final Map fields = creator.getFields();
        userBuilder.setUserName((String) fields.get(UserField.NAME));
        userBuilder.setPassword((String) fields.get(UserField.PASSWORD));
        final String firstName = (String) fields.get(UserField.FIRST_NAME);
        if (firstName != null) {
            userBuilder.setFirstName(firstName);
        }
        final String lastName = (String) fields.get(UserField.LAST_NAME);
        if (lastName != null) {
            userBuilder.setLastName(lastName);
        }
        final String iconName = (String) fields.get(UserField.ICON_NAME);
        if (iconName != null) {
            userBuilder.setIconName(iconName);
        }
        final String iconPath = (String) fields.get(UserField.ICON_PATH);
        if (iconPath != null) {
            userBuilder.setIconPath(iconPath);
        }
        final String jobTitle = (String) fields.get(UserField.JOB_TITLE);
        if (jobTitle != null) {
            userBuilder.setJobTitle(jobTitle);
        }
        final String title = (String) fields.get(UserField.TITLE);
        if (title != null) {
            userBuilder.setTitle(title);
        }
        userBuilder.setCreatedBy(getCurrentUserId());

        final Long managerUserId = (Long) fields.get(UserField.MANAGER_ID);
        if (managerUserId != null) {
            userBuilder.setManagerUserId(managerUserId);
        }

        final Boolean enabled = (Boolean) fields.get(UserField.ENABLED);
        if (enabled != null) {
            userBuilder.setEnabled(enabled);
        } else {
            userBuilder.setEnabled(Boolean.FALSE);
        }
        userBuilder.setCreationDate(now);
        userBuilder.setLastUpdate(now);
        userBuilder.setLastConnection(null);
        return userBuilder.done();
    }

    public static SContactInfo constructSUserContactInfo(final UserCreator creator, final long userId, final boolean personal,
            final IdentityModelBuilder identityModelBuilder) {
        Map fields;
        if (personal) {
            fields = creator.getPersoFields();
        } else {
            fields = creator.getProFields();
        }
        if (fields != null && !fields.isEmpty()) {
            final SContactInfoBuilder contactInfoBuilder = identityModelBuilder.getUserContactInfoBuilder().createNewInstance(userId, personal);
            final String address = (String) fields.get(ContactDataField.ADDRESS);
            if (address != null) {
                contactInfoBuilder.setAddress(address);
            }
            final String email = (String) fields.get(ContactDataField.EMAIL);
            if (email != null) {
                contactInfoBuilder.setEmail(email);
            }
            final String building = (String) fields.get(ContactDataField.BUILDING);
            if (building != null) {
                contactInfoBuilder.setBuilding(building);
            }
            final String city = (String) fields.get(ContactDataField.CITY);
            if (city != null) {
                contactInfoBuilder.setCity(city);
            }
            final String country = (String) fields.get(ContactDataField.COUNTRY);
            if (country != null) {
                contactInfoBuilder.setCountry(country);
            }
            final String fax = (String) fields.get(ContactDataField.FAX);
            if (fax != null) {
                contactInfoBuilder.setFaxNumber(fax);
            }
            final String mobile = (String) fields.get(ContactDataField.MOBILE);
            if (mobile != null) {
                contactInfoBuilder.setMobileNumber(mobile);
            }
            final String phone = (String) fields.get(ContactDataField.PHONE);
            if (phone != null) {
                contactInfoBuilder.setPhoneNumber(phone);
            }
            final String room = (String) fields.get(ContactDataField.ROOM);
            if (room != null) {
                contactInfoBuilder.setRoom(room);
            }
            final String state = (String) fields.get(ContactDataField.STATE);
            if (state != null) {
                contactInfoBuilder.setState(state);
            }
            final String website = (String) fields.get(ContactDataField.WEBSITE);
            if (website != null) {
                contactInfoBuilder.setWebsite(website);
            }
            final String zipCode = (String) fields.get(ContactDataField.ZIP_CODE);
            if (zipCode != null) {
                contactInfoBuilder.setZipCode(zipCode);
            }
            return contactInfoBuilder.done();
        } else {
            return null;
        }
    }

    public static SUser constructSUser(final ExportedUser newUser, final IdentityModelBuilder identityModelBuilder) {
        final SUserBuilder userBuilder = identityModelBuilder.getUserBuilder().createNewInstance();
        final long now = System.currentTimeMillis();
        userBuilder.setCreationDate(now);
        userBuilder.setLastUpdate(now);
        userBuilder.setLastConnection(null);

        userBuilder.setUserName(newUser.getUserName());
        userBuilder.setPassword(newUser.getPassword());
        userBuilder.setFirstName(newUser.getFirstName());
        userBuilder.setLastName(newUser.getLastName());
        userBuilder.setIconName(newUser.getIconName());
        userBuilder.setIconPath(newUser.getIconPath());
        userBuilder.setJobTitle(newUser.getJobTitle());
        userBuilder.setTitle(newUser.getTitle());
        userBuilder.setCreatedBy(newUser.getCreatedBy() == 0 ? getCurrentUserId() : newUser.getCreatedBy());
        userBuilder.setManagerUserId(newUser.getManagerUserId());
        userBuilder.setEnabled(newUser.isEnabled());
        return userBuilder.done();
    }

    public static SContactInfo constructSUserContactInfo(final ExportedUser user, final boolean isPersonal, final IdentityModelBuilder identityModelBuilder,
            final long userId) {
        final SContactInfoBuilder contactInfoBuilder = identityModelBuilder.getUserContactInfoBuilder().createNewInstance(userId, isPersonal);
        if (isPersonal) {
            contactInfoBuilder.setAddress(user.getPersonalAddress());
            contactInfoBuilder.setBuilding(user.getPersonalBuilding());
            contactInfoBuilder.setCity(user.getPersonalCity());
            contactInfoBuilder.setCountry(user.getPersonalCountry());
            contactInfoBuilder.setEmail(user.getPersonalEmail());
            contactInfoBuilder.setFaxNumber(user.getPersonalFaxNumber());
            contactInfoBuilder.setMobileNumber(user.getPersonalMobileNumber());
            contactInfoBuilder.setPhoneNumber(user.getPersonalPhoneNumber());
            contactInfoBuilder.setRoom(user.getPersonalRoom());
            contactInfoBuilder.setState(user.getPersonalState());
            contactInfoBuilder.setWebsite(user.getPersonalWebsite());
            contactInfoBuilder.setZipCode(user.getPersonalZipCode());
        } else {
            contactInfoBuilder.setAddress(user.getProfessionalAddress());
            contactInfoBuilder.setBuilding(user.getProfessionalBuilding());
            contactInfoBuilder.setCity(user.getProfessionalCity());
            contactInfoBuilder.setCountry(user.getProfessionalCountry());
            contactInfoBuilder.setEmail(user.getProfessionalEmail());
            contactInfoBuilder.setFaxNumber(user.getProfessionalFaxNumber());
            contactInfoBuilder.setMobileNumber(user.getProfessionalMobileNumber());
            contactInfoBuilder.setPhoneNumber(user.getProfessionalPhoneNumber());
            contactInfoBuilder.setRoom(user.getProfessionalRoom());
            contactInfoBuilder.setState(user.getProfessionalState());
            contactInfoBuilder.setWebsite(user.getProfessionalWebsite());
            contactInfoBuilder.setZipCode(user.getProfessionalZipCode());
        }
        return contactInfoBuilder.done();
    }

    public static SRole constructSRole(final RoleCreator creator, final IdentityModelBuilder identityModelBuilder) {
        final long now = System.currentTimeMillis();
        final RoleBuilder roleBuilder = identityModelBuilder.getRoleBuilder();
        roleBuilder.createNewInstance();
        roleBuilder.setCreatedBy(getCurrentUserId());
        roleBuilder.setCreationDate(now).setLastUpdate(now);
        final Map fields = creator.getFields();
        roleBuilder.setName((String) fields.get(RoleField.NAME));
        final String displayName = (String) fields.get(RoleField.DISPLAY_NAME);
        if (displayName != null) {
            roleBuilder.setDisplayName(displayName);
        }
        final String description = (String) fields.get(RoleField.DESCRIPTION);
        if (description != null) {
            roleBuilder.setDescription(description);
        }
        final String iconName = (String) fields.get(RoleField.ICON_NAME);
        if (iconName != null) {
            roleBuilder.setIconName(iconName);
        }
        final String iconPath = (String) fields.get(RoleField.ICON_PATH);
        if (iconPath != null) {
            roleBuilder.setIconPath(iconPath);
        }
        return roleBuilder.done();
    }

    public static SGroup constructSGroup(final GroupCreator creator, final IdentityModelBuilder identityModelBuilder) {
        final long now = System.currentTimeMillis();
        final GroupBuilder groupBuilder = identityModelBuilder.getGroupBuilder();
        groupBuilder.createNewInstance();
        groupBuilder.setCreatedBy(getCurrentUserId());
        groupBuilder.setCreationDate(now).setLastUpdate(now);
        final Map fields = creator.getFields();
        groupBuilder.setName((String) fields.get(GroupField.NAME));
        final String parentPath = (String) fields.get(GroupField.PARENT_PATH);
        if (parentPath != null) {
            groupBuilder.setParentPath(parentPath);
        }
        final String displayName = (String) fields.get(GroupField.DISPLAY_NAME);
        if (displayName != null) {
            groupBuilder.setDisplayName(displayName);
        }
        final String description = (String) fields.get(GroupField.DESCRIPTION);
        if (description != null) {
            groupBuilder.setDescription(description);
        }
        final String iconName = (String) fields.get(GroupField.ICON_NAME);
        if (iconName != null) {
            groupBuilder.setIconName(iconName);
        }
        final String iconPath = (String) fields.get(GroupField.ICON_PATH);
        if (iconPath != null) {
            groupBuilder.setIconPath(iconPath);
        }
        return groupBuilder.done();
    }

    public static List toProcessSupervisors(final List sSupervisors) {
        final List processSupervisors = new ArrayList();
        if (sSupervisors != null) {
            for (final SProcessSupervisor sSupervisor : sSupervisors) {
                processSupervisors.add(toProcessSupervisor(sSupervisor));
            }
        }
        return processSupervisors;
    }

    public static ProcessSupervisor toProcessSupervisor(final SProcessSupervisor sSupervisor) {
        final ProcessSupervisorBuilder processSupervisorBuilder = new ProcessSupervisorBuilder();
        processSupervisorBuilder.setSupervisorId(sSupervisor.getId());
        processSupervisorBuilder.setProcessDefinitionId(sSupervisor.getProcessDefId());
        processSupervisorBuilder.setUserId(sSupervisor.getUserId());
        processSupervisorBuilder.setGroupId(sSupervisor.getGroupId());
        processSupervisorBuilder.setRoleId(sSupervisor.getRoleId());
        return processSupervisorBuilder.done();
    }

    public static List toDocuments(final Collection attachments) {
        final List documents = new ArrayList();
        for (final SProcessDocument sProcessDocument : attachments) {
            final Document document = toDocument(sProcessDocument);
            documents.add(document);
        }
        return documents;
    }

    public static Document toDocument(final SProcessDocument attachment) {
        final DocumentImpl documentImpl = new DocumentImpl();
        documentImpl.setId(attachment.getId());
        documentImpl.setProcessInstanceId(attachment.getProcessInstanceId());
        documentImpl.setName(attachment.getName());
        documentImpl.setAuthor(attachment.getAuthor());
        documentImpl.setCreationDate(new Date(attachment.getCreationDate()));
        documentImpl.setHasContent(attachment.hasContent());
        documentImpl.setContentMimeType(attachment.getContentMimeType());
        documentImpl.setFileName(attachment.getContentFileName());
        documentImpl.setContentStorageId(attachment.getContentStorageId());
        documentImpl.setUrl(attachment.getURL());

        return documentImpl;
    }

    public static List toArchivedDocuments(final Collection attachments) {
        final List documents = new ArrayList();
        for (final SAProcessDocument sAProcessDocument : attachments) {
            final ArchivedDocument document = toArchivedDocument(sAProcessDocument);
            documents.add(document);
        }
        return documents;
    }

    public static ArchivedDocument toArchivedDocument(final SAProcessDocument attachment) {
        final ArchivedDocumentImpl documentImpl = new ArchivedDocumentImpl(attachment.getName());
        documentImpl.setId(attachment.getId());
        documentImpl.setProcessInstanceId(attachment.getProcessInstanceId());
        documentImpl.setArchiveDate(new Date(attachment.getArchiveDate()));
        documentImpl.setContentStorageId(attachment.getContentStorageId());
        documentImpl.setDocumentAuthor(attachment.getAuthor());
        documentImpl.setDocumentContentFileName(attachment.getContentFileName());
        documentImpl.setDocumentContentMimeType(attachment.getContentMimeType());
        documentImpl.setDocumentCreationDate(new Date(attachment.getCreationDate()));
        documentImpl.setDocumentHasContent(attachment.hasContent());
        documentImpl.setDocumentURL(attachment.getURL());
        documentImpl.setSourceObjectId(attachment.getSourceObjectId());
        return documentImpl;
    }

    public static int getServerActivityStateId(final String state) {
        int stateId = -1;
        if (state.equalsIgnoreCase(ActivityStates.READY_STATE)) {
            stateId = 4;
        } else if (state.equalsIgnoreCase(ActivityStates.COMPLETING_STATE)) {
            stateId = 9;
        } else if (state.equalsIgnoreCase(ActivityStates.COMPLETED_STATE)) {
            stateId = 2;
        } else if (state.equalsIgnoreCase(ActivityStates.EXECUTING_STATE)) {
            stateId = 1;
        } else if (state.equalsIgnoreCase(ActivityStates.INITIALIZING_STATE)) {
            stateId = 0;
        } else if (state.equalsIgnoreCase(ActivityStates.SKIPPED_STATE)) {
            stateId = 12;
        } else if (state.equalsIgnoreCase(ActivityStates.CANCELLING_SUBTASKS_STATE)) {
            stateId = 13;
        } else if (state.equalsIgnoreCase(ActivityStates.CANCELLED_STATE)) {
            stateId = 14;
        }
        return stateId;
    }

    public static ProcessInstanceState getProcessInstanceState(final String state) {
        ProcessInstanceState pis = null;
        if (state.equalsIgnoreCase(ProcessInstanceState.ABORTED.toString())) {
            pis = ProcessInstanceState.ABORTED;
        } else if (state.equalsIgnoreCase(ProcessInstanceState.CANCELLED.toString())) {
            pis = ProcessInstanceState.CANCELLED;
        } else if (state.equalsIgnoreCase(ProcessInstanceState.COMPLETED.toString())) {
            pis = ProcessInstanceState.COMPLETED;
        } else if (state.equalsIgnoreCase(ProcessInstanceState.COMPLETING.toString())) {
            pis = ProcessInstanceState.COMPLETING;
        } else if (state.equalsIgnoreCase(ProcessInstanceState.ERROR.toString())) {
            pis = ProcessInstanceState.ERROR;
        } else if (state.equalsIgnoreCase(ProcessInstanceState.INITIALIZING.toString())) {
            pis = ProcessInstanceState.INITIALIZING;
        } else if (state.equalsIgnoreCase(ProcessInstanceState.STARTED.toString())) {
            pis = ProcessInstanceState.STARTED;
        } else if (state.equalsIgnoreCase(ProcessInstanceState.SUSPENDED.toString())) {
            pis = ProcessInstanceState.SUSPENDED;
        }
        return pis;
    }

    public static Comment toComment(final SComment sComment) {
        final CommentImpl commentImpl = new CommentImpl();
        commentImpl.setTenantId(sComment.getTenantId());
        commentImpl.setId(sComment.getId());
        commentImpl.setUserId(sComment.getUserId());
        commentImpl.setProcessInstanceId(sComment.getProcessInstanceId());
        commentImpl.setPostDate(sComment.getPostDate());
        commentImpl.setContent(sComment.getContent());
        return commentImpl;
    }

    public static List toComments(final List sComments) {
        final List comments = new ArrayList();
        for (final SComment sComment : sComments) {
            comments.add(toComment(sComment));
        }
        return comments;
    }

    public static Map constructExpressions(final SExpressionBuilders sExpressionBuilders, final Map inputs) {

        final Map result = new HashMap(inputs.size());
        for (final Entry expression : inputs.entrySet()) {
            result.put(expression.getKey(), constructSExpression(expression.getValue(), sExpressionBuilders.getExpressionBuilder()));
        }
        return result;
    }

    public static SExpression constructSExpression(final Expression model, final SExpressionBuilder expressionBuilder) {
        final ArrayList dependencies = new ArrayList();
        for (final Expression dep : model.getDependencies()) {
            dependencies.add(constructSExpression(dep, expressionBuilder));
        }
        expressionBuilder.createNewInstance();
        expressionBuilder.setName(model.getName());
        expressionBuilder.setContent(model.getContent());
        expressionBuilder.setExpressionType(model.getExpressionType());
        expressionBuilder.setInterpreter(model.getInterpreter());
        expressionBuilder.setReturnType(model.getReturnType());
        expressionBuilder.setDependencies(dependencies);
        try {
            return expressionBuilder.done();
        } catch (final SInvalidExpressionException e) {
            throw new IllegalArgumentException("Error constructing SExpression");
        }
    }

    public static SOperation constructSOperation(final Operation operation, final TenantServiceAccessor serviceAccessor) {
        final SOperationBuilders sOperationBuilders = serviceAccessor.getSOperationBuilders();
        final SExpressionBuilder sExpressionBuilder = serviceAccessor.getSExpressionBuilders().getExpressionBuilder();
        final SExpression rightOperand = constructSExpression(operation.getRightOperand(), sExpressionBuilder);
        final SOperatorType operatorType = SOperatorType.valueOf(operation.getType().name());
        final SLeftOperand sLeftOperand = constructSLeftOperand(operation.getLeftOperand(), sOperationBuilders);
        return sOperationBuilders.getSOperationBuilder().createNewInstance().setOperator(operation.getOperator()).setRightOperand(rightOperand)
                .setType(operatorType).setLeftOperand(sLeftOperand).done();
    }

    public static SOperation constructSOperation(final Operation operation, final SOperationBuilders operationBuilders,
            final SExpressionBuilders expressionBuilders) {
        final SExpressionBuilder sExpressionBuilder = expressionBuilders.getExpressionBuilder();
        final SExpression rightOperand = constructSExpression(operation.getRightOperand(), sExpressionBuilder);
        final SOperatorType operatorType = SOperatorType.valueOf(operation.getType().name());
        final SLeftOperand sLeftOperand = constructSLeftOperand(operation.getLeftOperand(), operationBuilders);
        return operationBuilders.getSOperationBuilder().createNewInstance().setOperator(operation.getOperator()).setRightOperand(rightOperand)
                .setType(operatorType).setLeftOperand(sLeftOperand).done();
    }

    private static SLeftOperand constructSLeftOperand(final LeftOperand variableToSet, final SOperationBuilders sOperationBuilders) {
        return sOperationBuilders.getSLeftOperandBuilder().createNewInstance().setName(variableToSet.getName()).setExternal(variableToSet.isExternal()).done();
    }

    public static List toConnectorImplementationDescriptors(
            final List sConnectorImplementationDescriptors) {
        if (sConnectorImplementationDescriptors != null) {
            final List connectorImplementationDescriptors = new ArrayList(
                    sConnectorImplementationDescriptors.size());
            for (final SConnectorImplementationDescriptor sConnectorImplementationDescriptor : sConnectorImplementationDescriptors) {
                connectorImplementationDescriptors.add(toConnectorImplementationDescriptor(sConnectorImplementationDescriptor));
            }
            return connectorImplementationDescriptors;
        }
        return Collections.emptyList();
    }

    public static ConnectorImplementationDescriptor toConnectorImplementationDescriptor(
            final SConnectorImplementationDescriptor sConnectorImplementationDescriptor) {
        return new ConnectorImplementationDescriptor(sConnectorImplementationDescriptor.getImplementationClassName(),
                sConnectorImplementationDescriptor.getId(), sConnectorImplementationDescriptor.getVersion(),
                sConnectorImplementationDescriptor.getDefinitionId(), sConnectorImplementationDescriptor.getDefinitionVersion(),
                sConnectorImplementationDescriptor.getJarDependencies().getDependencies());
    }

    public static List toArchivedComments(final List serverObjects) {
        final List commments = new ArrayList();
        for (final SAComment saComment : serverObjects) {
            final ArchivedComment comment = toArchivedComment(saComment);
            commments.add(comment);
        }
        return commments;
    }

    public static ArchivedComment toArchivedComment(final SAComment saComment) {
        final ArchivedCommentImpl commentImpl = new ArchivedCommentImpl(saComment.getContent());
        commentImpl.setId(saComment.getId());
        commentImpl.setProcessInstanceId(saComment.getProcessInstanceId());
        commentImpl.setArchiveDate(new Date(saComment.getArchiveDate()));
        commentImpl.setContent(saComment.getContent());
        commentImpl.setSourceObjectId(saComment.getSourceObjectId());
        commentImpl.setUserId(saComment.getUserId());
        commentImpl.setPostDate(new Date(saComment.getPostDate()));
        return commentImpl;
    }

    public static Operation toOperation(final SOperation operation) {
        final OperationImpl operationImpl = new OperationImpl();
        operationImpl.setRightOperand(toExpression(operation.getRightOperand()));
        operationImpl.setOperator(operation.getOperator());
        operationImpl.setType(toOperatorType(operation.getType()));
        final LeftOperandImpl variableToSet = new LeftOperandImpl();
        final SLeftOperand variableToSet2 = operation.getLeftOperand();
        variableToSet.setName(variableToSet2.getName());
        variableToSet.setExternal(variableToSet2.isExternal());
        operationImpl.setLeftOperand(variableToSet);
        return operationImpl;
    }

    private static OperatorType toOperatorType(final SOperatorType type) {
        OperatorType operatorType = null;
        if (SOperatorType.ASSIGNMENT.equals(type)) {
            operatorType = OperatorType.ASSIGNMENT;
        } else if (SOperatorType.JAVA_METHOD.equals(type)) {
            operatorType = OperatorType.JAVA_METHOD;
        } else if (SOperatorType.XPATH_UPDATE_QUERY.equals(type)) {
            operatorType = OperatorType.XPATH_UPDATE_QUERY;
        }
        return operatorType;
    }

    public static ConnectorDefinition toConnectorDefinition(final SConnectorDefinition connector) {
        final ConnectorDefinitionImpl connectorDefinitionImpl = new ConnectorDefinitionImpl(connector.getName(), connector.getConnectorId(),
                connector.getVersion(), connector.getActivationEvent());
        for (final Entry input : connector.getInputs().entrySet()) {
            connectorDefinitionImpl.addInput(input.getKey(), toExpression(input.getValue()));
        }
        for (final SOperation operation : connector.getOutputs()) {
            connectorDefinitionImpl.addOutput(toOperation(operation));
        }
        return connectorDefinitionImpl;
    }

    public static List toActors(final List sActors) {
        final List actors = new ArrayList();
        for (final SActor sActor : sActors) {
            final ActorInstance actor = toActorInstance(sActor);
            actors.add(actor);
        }
        return actors;
    }

    public static List toArchivedFlowElementInstances(final List serverObjects) {
        // TODO Implement me!
        return null;
    }

    public static List toArchivedFlowNodeInstances(final List saFlowNodes,
            final FlowNodeStateManager flowNodeStateManager) {
        final List flowNodeInstances = new ArrayList();
        for (final SAFlowNodeInstance saFlowNode : saFlowNodes) {
            final ArchivedFlowNodeInstance flowNodeInstance = toArchivedFlowNodeInstance(saFlowNode, flowNodeStateManager);
            flowNodeInstances.add(flowNodeInstance);
        }
        return flowNodeInstances;
    }

    public static ArchivedFlowNodeInstance toArchivedFlowNodeInstance(final SAFlowNodeInstance saFlowNode, final FlowNodeStateManager flowNodeStateManager) {
        ArchivedFlowNodeInstance archiveFlowNodeInstance = null;
        switch (saFlowNode.getType()) {
            case AUTOMATIC_TASK:
                archiveFlowNodeInstance = toArchivedAutomaticTaskInstance((SAAutomaticTaskInstance) saFlowNode, flowNodeStateManager);
                break;
            case MANUAL_TASK:
                archiveFlowNodeInstance = toArchivedManualTaskInstance((SAManualTaskInstance) saFlowNode, flowNodeStateManager);
                break;
            case USER_TASK:
                archiveFlowNodeInstance = toArchivedUserTaskInstance((SAUserTaskInstance) saFlowNode, flowNodeStateManager);
                break;
            case RECEIVE_TASK:
                archiveFlowNodeInstance = toArchivedReceiveTaskInstance((SAReceiveTaskInstance) saFlowNode, flowNodeStateManager);
                break;
            case SEND_TASK:
                archiveFlowNodeInstance = toArchivedSendTaskInstance((SASendTaskInstance) saFlowNode, flowNodeStateManager);
                break;
            case CALL_ACTIVITY:
                archiveFlowNodeInstance = toArchivedCallActivityInstance((SACallActivityInstance) saFlowNode, flowNodeStateManager);
                break;
            case LOOP_ACTIVITY:
                archiveFlowNodeInstance = toArchivedLoopActivityInstance((SALoopActivityInstance) saFlowNode, flowNodeStateManager);
                break;
            case SUB_PROCESS:
                archiveFlowNodeInstance = toArchivedSubProcessActivityInstance((SASubProcessActivityInstance) saFlowNode, flowNodeStateManager);
                break;
            case GATEWAY:
                archiveFlowNodeInstance = toArchivedGatewayInstance((SAGatewayInstance) saFlowNode, flowNodeStateManager);
                break;
            case MULTI_INSTANCE_ACTIVITY:
                archiveFlowNodeInstance = toArchivedMultiInstanceActivityInstance((SAMultiInstanceActivityInstance) saFlowNode, flowNodeStateManager);
                break;
            case BOUNDARY_EVENT:
            case START_EVENT:
            case INTERMEDIATE_CATCH_EVENT:
            case INTERMEDIATE_THROW_EVENT:
            case END_EVENT:
                // archiveFlowNodeInstance = toArchivedEventInstance((SAEventInstance) saFlowNode, flowNodeStateManager);
                break;
            default:
                throw new UnknownElementType(saFlowNode.getType().name());
        }
        return archiveFlowNodeInstance;
    }

    public static long getCurrentUserId() {
        SessionAccessor sessionAccessor;
        try {
            sessionAccessor = ServiceAccessorFactory.getInstance().createSessionAccessor();
            final PlatformServiceAccessor platformServiceAccessor = ServiceAccessorFactory.getInstance().createPlatformServiceAccessor();
            return platformServiceAccessor.getSessionService().getSession(sessionAccessor.getSessionId()).getUserId();
        } catch (final BonitaHomeNotSetException e) {
            throw new RuntimeException(e);
        } catch (final BonitaHomeConfigurationException e) {
            throw new RuntimeException(e);
        } catch (final InstantiationException e) {
            throw new RuntimeException(e);
        } catch (final IllegalAccessException e) {
            throw new RuntimeException(e);
        } catch (final ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (final IOException e) {
            throw new RuntimeException(e);
        } catch (final SessionIdNotSetException e) {
            throw new RuntimeException(e);
        } catch (final SSessionNotFoundException e) {
            throw new RuntimeException(e);
        }
    }

    public static List toConnectorInstances(final List sConnectorInstances) {
        final ArrayList connectorInstances = new ArrayList(sConnectorInstances.size());
        for (final SConnectorInstance sConnectorInstance : sConnectorInstances) {
            connectorInstances.add(toConnectorInstance(sConnectorInstance));
        }
        return connectorInstances;
    }

    private static ConnectorInstance toConnectorInstance(final SConnectorInstance sConnectorInstance) {
        final ConnectorInstanceImpl connectorInstanceImpl = new ConnectorInstanceImpl(sConnectorInstance.getName(), sConnectorInstance.getContainerId(),
                sConnectorInstance.getContainerType(), sConnectorInstance.getConnectorId(), sConnectorInstance.getVersion(),
                ConnectorState.valueOf(sConnectorInstance.getState()), sConnectorInstance.getActivationEvent());
        connectorInstanceImpl.setId(sConnectorInstance.getId());
        return connectorInstanceImpl;
    }

    public static ArchivedConnectorInstance toArchivedConnectorInstance(final SAConnectorInstance sAConnectorInstance) {
        final ArchivedConnectorInstanceImpl connectorInstanceImpl = new ArchivedConnectorInstanceImpl(sAConnectorInstance.getName(), new Date(
                sAConnectorInstance.getArchiveDate()), sAConnectorInstance.getContainerId(), sAConnectorInstance.getContainerType(),
                sAConnectorInstance.getConnectorId(), sAConnectorInstance.getVersion(), sAConnectorInstance.getActivationEvent(),
                ConnectorState.valueOf(sAConnectorInstance.getState()), sAConnectorInstance.getSourceObjectId());
        connectorInstanceImpl.setId(sAConnectorInstance.getId());
        return connectorInstanceImpl;
    }

    public static List toArchivedConnectorInstances(final List serverObjects) {
        final List commments = new ArrayList();
        for (final SAConnectorInstance saConnectorInstance : serverObjects) {
            final ArchivedConnectorInstance archivedConnectorInstance = toArchivedConnectorInstance(saConnectorInstance);
            commments.add(archivedConnectorInstance);
        }
        return commments;
    }

    public static List toProfiles(final List sProfiles) {
        final List profiles = new ArrayList(sProfiles.size());
        for (final SProfile sProfile : sProfiles) {
            final Profile profile = toProfile(sProfile);
            profiles.add(profile);
        }
        return profiles;
    }

    public static Profile toProfile(final SProfile sProfile) {
        final ProfileImpl profileImpl = new ProfileImpl(sProfile.getName());
        profileImpl.setId(sProfile.getId());
        profileImpl.setDescription(sProfile.getDescription());
        profileImpl.setIconPath(sProfile.getIconPath());
        return profileImpl;
    }

    public static List toProfileEntries(final List sProfileEntries) {
        final List profiles = new ArrayList(sProfileEntries.size());
        for (final SProfileEntry sProfileEntry : sProfileEntries) {
            final ProfileEntry profile = toProfileEntry(sProfileEntry);
            profiles.add(profile);
        }
        return profiles;
    }

    public static ProfileEntry toProfileEntry(final SProfileEntry sProfileEntry) {
        final ProfileEntryImpl profileEntryImpl = new ProfileEntryImpl(sProfileEntry.getName(), sProfileEntry.getProfileId());
        profileEntryImpl.setId(sProfileEntry.getId());
        profileEntryImpl.setDescription(sProfileEntry.getDescription());
        profileEntryImpl.setIndex(sProfileEntry.getIndex());
        profileEntryImpl.setPage(sProfileEntry.getPage());
        profileEntryImpl.setParentId(sProfileEntry.getParentId());
        profileEntryImpl.setType(sProfileEntry.getType());
        return profileEntryImpl;
    }

    public static List toProfileMembers(final List sProfileMembers) {
        final List profiles = new ArrayList(sProfileMembers.size());
        for (final SProfileMember sProfileMember : sProfileMembers) {
            final ProfileMember profile = toProfileMember(sProfileMember);
            profiles.add(profile);
        }
        return profiles;
    }

    public static ProfileMember toProfileMember(final SProfileMember sProfileMember) {
        final ProfileMemberImpl profileMemberImpl = new ProfileMemberImpl();
        profileMemberImpl.setId(sProfileMember.getId());
        profileMemberImpl.setDisplayNamePart1(sProfileMember.getDisplayNamePart1());
        profileMemberImpl.setDisplayNamePart2(sProfileMember.getDisplayNamePart2());
        profileMemberImpl.setDisplayNamePart3(sProfileMember.getDisplayNamePart3());
        profileMemberImpl.setGroupId(sProfileMember.getGroupId());
        profileMemberImpl.setProfileId(sProfileMember.getProfileId());
        profileMemberImpl.setRoleId(sProfileMember.getRoleId());
        profileMemberImpl.setUserId(sProfileMember.getUserId());
        return profileMemberImpl;
    }

    public static SProfileMember constructSProfileMember(final ProfileMemberCreator creator, final SProfileMemberBuilder sProfileMemberBuilder) {
        final Map fields = creator.getFields();
        final SProfileMemberBuilder newSProfileMemberBuilder = sProfileMemberBuilder.createNewInstance((Long) fields.get(ProfileMemberField.PROFILE_ID));
        final Long groupeId = (Long) fields.get(ProfileMemberField.GROUP_ID);
        if (groupeId != null) {
            newSProfileMemberBuilder.setGroupId(groupeId);
        }
        final Long roleId = (Long) fields.get(ProfileMemberField.ROLE_ID);
        if (roleId != null) {
            newSProfileMemberBuilder.setRoleId(roleId);
        }
        final Long userId = (Long) fields.get(ProfileMemberField.USER_ID);
        if (userId != null) {
            newSProfileMemberBuilder.setUserId(userId);
        }
        return newSProfileMemberBuilder.done();
    }

    public static Report toReport(final SReport sReport) {
        final ReportImpl report = new ReportImpl(sReport.getId(), sReport.getName(), sReport.getInstallationDate(), sReport.getInstalledBy());
        report.setDescription(sReport.getDescription());
        report.setProvided(sReport.isProvided());
        return report;
    }

    public static List toReports(final List sReports) {
        final List reports = new ArrayList(sReports.size());
        for (final SReport sReport : sReports) {
            reports.add(toReport(sReport));
        }
        return reports;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy