public class ExecutionImpl extends Object implements Serializable, ActivityExecution, ExecutionListenerExecution, PvmExecution, InterpretableExecution
Modifier and Type | Field and Description |
---|---|
protected ActivityImpl |
activity
current activity
|
protected String |
activityInstanceId
the Id of the current activity instance
|
protected int |
activityInstanceState |
protected String |
businessKey
the business key
|
protected String |
deleteReason |
protected boolean |
deleteRoot |
protected String |
eventName |
protected PvmProcessElement |
eventSource |
protected int |
executionListenerIndex |
protected List<ExecutionImpl> |
executions
nested executions representing scopes or concurrent paths
|
protected ExecutionStartContext |
executionStartContext
only available until the execution is started
|
protected boolean |
isActive
indicates if this execution represents an active path of execution.
|
protected boolean |
isConcurrent |
protected boolean |
isEnded |
protected boolean |
isEventScope |
protected boolean |
isOperating |
protected boolean |
isScope |
protected PvmActivity |
nextActivity |
protected AtomicOperation |
nextOperation
next operation.
|
protected ExecutionImpl |
parent
the parent execution
|
protected ProcessDefinitionImpl |
processDefinition |
protected ExecutionImpl |
processInstance
the process instance.
|
protected ProcessInstanceStartContext |
processInstanceStartContext
only available until the process instance is started
|
protected ExecutionImpl |
replacedBy
when execution structure is pruned during a takeAll, then
the original execution has to be resolved to the replaced execution.
|
protected ExecutionImpl |
subProcessInstance
reference to a subprocessinstance, not-null if currently subprocess is started from this execution
|
protected ExecutionImpl |
superExecution
super execution, not-null if this execution is part of a subprocess
|
protected TransitionImpl |
transition
current transition.
|
protected TransitionImpl |
transitionBeingTaken
transition that will be taken.
|
protected Map<String,Object> |
variables |
Constructor and Description |
---|
ExecutionImpl() |
ExecutionImpl(ActivityImpl initial) |
Modifier and Type | Method and Description |
---|---|
protected boolean |
allExecutionsInSameActivity(List<ExecutionImpl> executions) |
void |
cancelScope(String reason)
Called when a scope is cancelled.
|
protected void |
collectActiveActivityIds(List<String> activeActivityIds) |
protected void |
collectVariables(Map<String,Object> collectedVariables) |
ExecutionImpl |
createExecution()
creates a new execution.
|
ExecutionImpl |
createExecution(boolean initializeExecutionStartContext)
creates a new execution.
|
PvmProcessInstance |
createSubProcessInstance(PvmProcessDefinition processDefinition)
creates a new sub process instance.
|
PvmProcessInstance |
createSubProcessInstance(PvmProcessDefinition processDefinition,
String businessKey) |
void |
deleteCascade(String deleteReason) |
void |
deleteCascade2(String deleteReason) |
void |
deleteVariablesLocal() |
void |
destroy() |
void |
disposeExecutionStartContext() |
void |
disposeProcessInstanceStartContext() |
void |
end(boolean completeScope)
removes an execution.
|
void |
endCompensation()
Execution finished compensation.
|
protected void |
ensureActivityInitialized()
must be called before the activity member field or getActivity() is called
|
protected void |
ensureExecutionsInitialized()
must be called before memberfield executions is used.
|
protected void |
ensureParentInitialized()
must be called before memberfield parent is used.
|
protected void |
ensureProcessDefinitionInitialized()
must be called before memberfield processDefinition is used.
|
protected void |
ensureProcessInstanceInitialized()
must be called before memberfield processInstance is used.
|
protected void |
ensureScopeInitialized() |
protected void |
ensureSubProcessInstanceInitialized() |
protected void |
ensureSuperExecutionInitialized() |
protected void |
ensureVariablesInitialized() |
void |
enterActivityInstance()
invoked to notify the execution that a new activity instance is started
|
void |
executeActivity(PvmActivity activity)
Executes the
ActivityBehavior associated with the given activity. |
List<String> |
findActiveActivityIds() |
ExecutionImpl |
findExecution(String activityId)
searches for an execution positioned in the given activity
|
List<ActivityExecution> |
findInactiveConcurrentExecutions(PvmActivity activity)
Retrieves all executions which are concurrent and inactive at the given activity.
|
protected String |
generateActivityInstanceId(String activityId)
generates an activity instance id
|
ActivityImpl |
getActivity()
ensures initialization and returns the activity
|
String |
getActivityInstanceId()
return the Id of the activity instance currently executed by this execution
|
FlowElement |
getBpmnModelElementInstance()
Returns the currently executed Element in the BPMN Model.
|
BpmnModelInstance |
getBpmnModelInstance()
Returns the
BpmnModelInstance for the currently executed Bpmn Model |
String |
getBusinessKey()
The business key for this execution.
|
String |
getCurrentActivityId()
Gets the id of the current activity.
|
String |
getCurrentActivityName()
Gets the name of the current activity.
|
String |
getCurrentTransitionId()
return the Id of the current transition
|
String |
getDeleteReason() |
String |
getEventName()
The
event name in case this execution is passed in for an ExecutionListener |
PvmProcessElement |
getEventSource() |
Integer |
getExecutionListenerIndex() |
List<ExecutionImpl> |
getExecutions()
ensures initialization and returns the non-null executions list
|
ExecutionStartContext |
getExecutionStartContext() |
String |
getId()
Unique id of this path of execution that can be used as a handle to provide external signals back into the engine after wait states.
|
PvmActivity |
getNextActivity()
An activity which is to be started next.
|
ExecutionImpl |
getParent()
ensures initialization and returns the parent
|
String |
getParentActivityInstanceId()
return the Id of the parent activity instance currently executed by this execution
|
String |
getParentId()
Gets the id of the parent of this execution.
|
String |
getProcessBusinessKey()
The business key for the process instance this execution is associated with.
|
ProcessDefinitionImpl |
getProcessDefinition()
ensures initialization and returns the process definition.
|
String |
getProcessDefinitionId()
The process definition key for the process instance this execution is associated with.
|
ProcessEngineServices |
getProcessEngineServices()
Returns the
ProcessEngineServices providing access to the
public API of the process engine. |
ExecutionImpl |
getProcessInstance()
ensures initialization and returns the process instance.
|
String |
getProcessInstanceId()
Reference to the overall process instance
|
ProcessInstanceStartContext |
getProcessInstanceStartContext() |
ExecutionImpl |
getReplacedBy() |
ExecutionImpl |
getSubProcessInstance() |
ExecutionImpl |
getSuperExecution() |
protected String |
getToStringIdentity() |
TransitionImpl |
getTransition() |
Object |
getVariable(String variableName) |
Object |
getVariableLocal(String variableName) |
Set<String> |
getVariableNames() |
Set<String> |
getVariableNamesLocal() |
Map<String,Object> |
getVariables() |
Map<String,Object> |
getVariablesLocal() |
protected boolean |
hasConcurrentSiblings(ExecutionImpl concurrentRoot) |
boolean |
hasVariable(String variableName) |
boolean |
hasVariableLocal(String variableName) |
boolean |
hasVariables() |
boolean |
hasVariablesLocal() |
void |
inactivate()
Inactivates this execution.
|
void |
initialize() |
void |
interruptScope(String reason)
Called when an execution is interrupted.
|
boolean |
isActive()
returns whether this execution is currently active.
|
boolean |
isActive(String activityId) |
boolean |
isCanceled()
Returns whether this execution has been canceled.
|
boolean |
isCompleteScope()
Returns whether this execution completed the parent scope.
|
boolean |
isConcurrent()
returns whether this execution is concurrent or not.
|
boolean |
isDeleteRoot() |
boolean |
isEnded()
returns whether this execution has ended or not.
|
boolean |
isEventScope() |
boolean |
isProcessInstance()
returns whether this execution is a process instance or not.
|
boolean |
isScope()
Returns whether this execution is a scope.
|
void |
leaveActivityInstance()
invoked to notify the execution that an activity instance is ended.
|
protected ExecutionImpl |
newExecution()
instantiates a new execution.
|
void |
performOperation(AtomicOperation executionOperation) |
void |
performOperationSync(AtomicOperation executionOperation) |
void |
remove() |
void |
removeVariable(String variableName)
Removes the variable and creates a new
HistoricVariableUpdateEntity . |
void |
removeVariableLocal(String variableName)
Removes the local variable and creates a new
HistoricVariableUpdateEntity . |
void |
removeVariables()
Removes the (local) variables and creates a new
HistoricVariableUpdateEntity for each of them. |
void |
removeVariables(Collection<String> variableNames)
Removes the variables and creates a new
HistoricVariableUpdateEntity for each of them. |
void |
removeVariablesLocal()
Removes the (local) variables and creates a new
HistoricVariableUpdateEntity for each of them. |
void |
removeVariablesLocal(Collection<String> variableNames)
Removes the local variables and creates a new
HistoricVariableUpdateEntity for each of them. |
void |
replace(InterpretableExecution execution) |
void |
setActive(boolean isActive)
makes this execution active or inactive.
|
void |
setActivity(PvmActivity activity)
sets the current activity.
|
void |
setActivityInstanceId(String activityInstanceId) |
void |
setBusinessKey(String businessKey) |
void |
setCanceled(boolean canceled) |
void |
setCompleteScope(boolean completeScope) |
void |
setConcurrent(boolean isConcurrent)
changes the concurrent indicator on this execution.
|
void |
setDeleteReason(String deleteReason) |
void |
setEventName(String eventName) |
void |
setEventScope(boolean isEventScope) |
void |
setEventSource(PvmProcessElement eventSource) |
void |
setExecutionListenerIndex(Integer executionListenerIndex) |
void |
setExecutions(List<ExecutionImpl> executions) |
void |
setParent(InterpretableExecution parent)
all updates need to go through this setter as subclasses can override this method
|
void |
setProcessDefinition(ProcessDefinitionImpl processDefinition) |
void |
setProcessInstance(InterpretableExecution processInstance)
for setting the process instance, this setter must be used as subclasses can override
|
void |
setReplacedBy(InterpretableExecution replacedBy) |
void |
setScope(boolean isScope)
Changes whether this execution is a scope or not
|
void |
setSubProcessInstance(InterpretableExecution subProcessInstance) |
void |
setSuperExecution(ExecutionImpl superExecution) |
void |
setTransition(TransitionImpl transition) |
void |
setTransitionBeingTaken(TransitionImpl transitionBeingTaken) |
void |
setVariable(String variableName,
Object value) |
void |
setVariableLocal(String variableName,
Object value) |
void |
setVariableLocally(String variableName,
Object value) |
void |
setVariables(Map<String,? extends Object> variables) |
void |
setVariablesLocal(Map<String,? extends Object> variables) |
void |
signal(String signalName,
Object signalData) |
void |
start() |
void |
start(Map<String,Object> variables) |
void |
start(String businessKey) |
void |
start(String businessKey,
Map<String,Object> variables) |
void |
take(PvmTransition transition)
leaves the current activity by taking the given transition.
|
void |
takeAll(List<PvmTransition> transitions,
List<ActivityExecution> recyclableExecutions)
Takes the given outgoing transitions, and potentially reusing
the given list of executions that were previously joined.
|
String |
toString() |
protected ProcessDefinitionImpl processDefinition
protected ActivityImpl activity
protected PvmActivity nextActivity
protected String activityInstanceId
protected TransitionImpl transition
protected TransitionImpl transitionBeingTaken
protected ExecutionImpl processInstance
protected ExecutionImpl parent
protected List<ExecutionImpl> executions
protected ExecutionImpl superExecution
protected ExecutionImpl subProcessInstance
protected ProcessInstanceStartContext processInstanceStartContext
protected ExecutionStartContext executionStartContext
protected String businessKey
protected boolean isActive
protected boolean isScope
protected boolean isConcurrent
protected boolean isEnded
protected boolean isEventScope
protected int activityInstanceState
protected String eventName
protected PvmProcessElement eventSource
protected int executionListenerIndex
protected boolean deleteRoot
protected String deleteReason
protected ExecutionImpl replacedBy
#takeAll(List, List)} {@link OutgoingExecution}
protected AtomicOperation nextOperation
protected boolean isOperating
public ExecutionImpl()
public ExecutionImpl(ActivityImpl initial)
public ExecutionImpl createExecution()
createExecution
in interface ActivityExecution
public ExecutionImpl createExecution(boolean initializeExecutionStartContext)
createExecution
in interface ActivityExecution
protected ExecutionImpl newExecution()
public PvmProcessInstance createSubProcessInstance(PvmProcessDefinition processDefinition)
ActivityExecution
createSubProcessInstance
in interface ActivityExecution
processDefinition
- The PvmProcessDefinition
of the subprocess.public PvmProcessInstance createSubProcessInstance(PvmProcessDefinition processDefinition, String businessKey)
createSubProcessInstance
in interface ActivityExecution
processDefinition
- The PvmProcessDefinition
of the subprocess.businessKey
- the business key of the process instanceActivityExecution.createSubProcessInstance(PvmProcessDefinition)
public void initialize()
initialize
in interface InterpretableExecution
public void destroy()
destroy
in interface InterpretableExecution
public void remove()
remove
in interface InterpretableExecution
public void cancelScope(String reason)
InterpretableExecution
cancelScope
in interface InterpretableExecution
public void interruptScope(String reason)
ActivityExecution
interruptScope
in interface ActivityExecution
public ExecutionImpl getParent()
getParent
in interface ActivityExecution
getParent
in interface InterpretableExecution
public String getParentId()
DelegateExecution
getParentId
in interface DelegateExecution
public void setParent(InterpretableExecution parent)
setParent
in interface InterpretableExecution
protected void ensureParentInitialized()
public List<ExecutionImpl> getExecutions()
getExecutions
in interface ActivityExecution
public ExecutionImpl getSuperExecution()
getSuperExecution
in interface InterpretableExecution
public void setSuperExecution(ExecutionImpl superExecution)
protected void ensureSuperExecutionInitialized()
public ExecutionImpl getSubProcessInstance()
getSubProcessInstance
in interface InterpretableExecution
public void setSubProcessInstance(InterpretableExecution subProcessInstance)
setSubProcessInstance
in interface InterpretableExecution
protected void ensureSubProcessInstanceInitialized()
public void deleteCascade(String deleteReason)
deleteCascade
in interface PvmProcessInstance
public void deleteCascade2(String deleteReason)
deleteCascade2
in interface InterpretableExecution
public void end(boolean completeScope)
end
in interface ActivityExecution
public void endCompensation()
ActivityExecution
endCompensation
in interface ActivityExecution
public ExecutionImpl findExecution(String activityId)
findExecution
in interface PvmProcessInstance
public List<String> findActiveActivityIds()
findActiveActivityIds
in interface PvmProcessInstance
protected void ensureExecutionsInitialized()
public ProcessDefinitionImpl getProcessDefinition()
getProcessDefinition
in interface InterpretableExecution
public String getProcessDefinitionId()
DelegateExecution
getProcessDefinitionId
in interface DelegateExecution
protected void ensureProcessDefinitionInitialized()
public ExecutionImpl getProcessInstance()
public String getProcessInstanceId()
DelegateExecution
getProcessInstanceId
in interface DelegateExecution
public String getBusinessKey()
DelegateExecution
getBusinessKey
in interface DelegateExecution
public void setBusinessKey(String businessKey)
public String getProcessBusinessKey()
DelegateExecution
getProcessBusinessKey
in interface DelegateExecution
public void setProcessInstance(InterpretableExecution processInstance)
setProcessInstance
in interface InterpretableExecution
protected void ensureProcessInstanceInitialized()
public ActivityImpl getActivity()
getActivity
in interface ActivityExecution
getActivity
in interface PvmExecution
public void setActivity(PvmActivity activity)
setActivity
in interface InterpretableExecution
protected void ensureActivityInitialized()
public void enterActivityInstance()
ActivityExecution
enterActivityInstance
in interface ActivityExecution
public void leaveActivityInstance()
ActivityExecution
leaveActivityInstance
in interface ActivityExecution
public String getParentActivityInstanceId()
ActivityExecution
getParentActivityInstanceId
in interface DelegateExecution
getParentActivityInstanceId
in interface ActivityExecution
protected String generateActivityInstanceId(String activityId)
protected void ensureScopeInitialized()
public boolean isScope()
ActivityExecution
isScope
in interface ActivityExecution
public void setScope(boolean isScope)
ActivityExecution
setScope
in interface ActivityExecution
public void start()
start
in interface PvmProcessInstance
public void start(Map<String,Object> variables)
start
in interface PvmProcessInstance
public void start(String businessKey)
start
in interface PvmProcessInstance
public void start(String businessKey, Map<String,Object> variables)
start
in interface PvmProcessInstance
public void signal(String signalName, Object signalData)
signal
in interface PvmExecution
public void take(PvmTransition transition)
ActivityExecution
take
in interface ActivityExecution
public void executeActivity(PvmActivity activity)
ActivityExecution
ActivityBehavior
associated with the given activity.executeActivity
in interface ActivityExecution
public List<ActivityExecution> findInactiveConcurrentExecutions(PvmActivity activity)
ActivityExecution
findInactiveConcurrentExecutions
in interface ActivityExecution
public void takeAll(List<PvmTransition> transitions, List<ActivityExecution> recyclableExecutions)
ActivityExecution
takeAll
in interface ActivityExecution
protected boolean allExecutionsInSameActivity(List<ExecutionImpl> executions)
public void performOperation(AtomicOperation executionOperation)
performOperation
in interface InterpretableExecution
public void performOperationSync(AtomicOperation executionOperation)
performOperationSync
in interface InterpretableExecution
protected boolean hasConcurrentSiblings(ExecutionImpl concurrentRoot)
public boolean isActive(String activityId)
public Object getVariable(String variableName)
getVariable
in interface VariableScope
getVariable
in interface PvmExecution
public Map<String,Object> getVariables()
getVariables
in interface VariableScope
getVariables
in interface PvmExecution
public void setVariables(Map<String,? extends Object> variables)
setVariables
in interface VariableScope
public void setVariable(String variableName, Object value)
setVariable
in interface VariableScope
setVariable
in interface PvmExecution
public boolean hasVariable(String variableName)
hasVariable
in interface VariableScope
hasVariable
in interface PvmExecution
protected void ensureVariablesInitialized()
protected String getToStringIdentity()
public boolean isProcessInstance()
ActivityExecution
isProcessInstance
in interface ActivityExecution
public void inactivate()
ActivityExecution
inactivate
in interface ActivityExecution
public String getId()
DelegateExecution
getId
in interface DelegateExecution
public TransitionImpl getTransition()
getTransition
in interface InterpretableExecution
public void setTransition(TransitionImpl transition)
setTransition
in interface InterpretableExecution
public Integer getExecutionListenerIndex()
getExecutionListenerIndex
in interface InterpretableExecution
public void setExecutionListenerIndex(Integer executionListenerIndex)
setExecutionListenerIndex
in interface InterpretableExecution
public boolean isConcurrent()
ActivityExecution
isConcurrent
in interface ActivityExecution
public void setConcurrent(boolean isConcurrent)
ActivityExecution
setConcurrent
in interface ActivityExecution
public boolean isActive()
ActivityExecution
isActive
in interface ActivityExecution
public void setActive(boolean isActive)
ActivityExecution
setActive
in interface ActivityExecution
public boolean isEnded()
ActivityExecution
isEnded
in interface ActivityExecution
isEnded
in interface PvmProcessInstance
public boolean isCanceled()
ActivityExecution
isCanceled
in interface ActivityExecution
public void setCanceled(boolean canceled)
setCanceled
in interface InterpretableExecution
public boolean isCompleteScope()
ActivityExecution
isCompleteScope
in interface ActivityExecution
public void setCompleteScope(boolean completeScope)
setCompleteScope
in interface InterpretableExecution
public void setProcessDefinition(ProcessDefinitionImpl processDefinition)
setProcessDefinition
in interface InterpretableExecution
public String getEventName()
DelegateExecution
event name
in case this execution is passed in for an ExecutionListener
getEventName
in interface DelegateExecution
getEventName
in interface ExecutionListenerExecution
public void setEventName(String eventName)
setEventName
in interface InterpretableExecution
public PvmProcessElement getEventSource()
getEventSource
in interface ExecutionListenerExecution
public void setEventSource(PvmProcessElement eventSource)
setEventSource
in interface InterpretableExecution
public String getDeleteReason()
getDeleteReason
in interface ExecutionListenerExecution
public void setDeleteReason(String deleteReason)
public ExecutionImpl getReplacedBy()
getReplacedBy
in interface InterpretableExecution
public void setReplacedBy(InterpretableExecution replacedBy)
setReplacedBy
in interface InterpretableExecution
public void replace(InterpretableExecution execution)
replace
in interface InterpretableExecution
public void setExecutions(List<ExecutionImpl> executions)
public boolean isDeleteRoot()
isDeleteRoot
in interface InterpretableExecution
public String getCurrentActivityId()
DelegateExecution
getCurrentActivityId
in interface DelegateExecution
public String getCurrentActivityName()
DelegateExecution
getCurrentActivityName
in interface DelegateExecution
public Object getVariableLocal(String variableName)
getVariableLocal
in interface VariableScope
public Set<String> getVariableNames()
getVariableNames
in interface VariableScope
public Set<String> getVariableNamesLocal()
getVariableNamesLocal
in interface VariableScope
public Map<String,Object> getVariablesLocal()
getVariablesLocal
in interface VariableScope
public boolean hasVariableLocal(String variableName)
hasVariableLocal
in interface VariableScope
public boolean hasVariables()
hasVariables
in interface VariableScope
public boolean hasVariablesLocal()
hasVariablesLocal
in interface VariableScope
public void removeVariable(String variableName)
VariableScope
HistoricVariableUpdateEntity
.removeVariable
in interface VariableScope
public void removeVariableLocal(String variableName)
VariableScope
HistoricVariableUpdateEntity
.removeVariableLocal
in interface VariableScope
public void removeVariables(Collection<String> variableNames)
VariableScope
HistoricVariableUpdateEntity
for each of them.removeVariables
in interface VariableScope
public void removeVariablesLocal(Collection<String> variableNames)
VariableScope
HistoricVariableUpdateEntity
for each of them.removeVariablesLocal
in interface VariableScope
public void removeVariables()
VariableScope
HistoricVariableUpdateEntity
for each of them.removeVariables
in interface VariableScope
public void removeVariablesLocal()
VariableScope
HistoricVariableUpdateEntity
for each of them.removeVariablesLocal
in interface VariableScope
public void deleteVariablesLocal()
public void setVariableLocal(String variableName, Object value)
setVariableLocal
in interface VariableScope
public void setVariablesLocal(Map<String,? extends Object> variables)
setVariablesLocal
in interface VariableScope
public boolean isEventScope()
isEventScope
in interface InterpretableExecution
public void setEventScope(boolean isEventScope)
setEventScope
in interface InterpretableExecution
public ProcessInstanceStartContext getProcessInstanceStartContext()
getProcessInstanceStartContext
in interface InterpretableExecution
public ExecutionStartContext getExecutionStartContext()
getExecutionStartContext
in interface InterpretableExecution
public void disposeProcessInstanceStartContext()
disposeProcessInstanceStartContext
in interface InterpretableExecution
public void disposeExecutionStartContext()
disposeExecutionStartContext
in interface InterpretableExecution
public String getActivityInstanceId()
ActivityExecution
getActivityInstanceId
in interface DelegateExecution
getActivityInstanceId
in interface ActivityExecution
public void setActivityInstanceId(String activityInstanceId)
setActivityInstanceId
in interface ActivityExecution
public PvmActivity getNextActivity()
ActivityExecution
getNextActivity
in interface ActivityExecution
public void setTransitionBeingTaken(TransitionImpl transitionBeingTaken)
public String getCurrentTransitionId()
DelegateExecution
getCurrentTransitionId
in interface DelegateExecution
public FlowElement getBpmnModelElementInstance()
BpmnModelExecutionContext
Returns the currently executed Element in the BPMN Model. This method returns a FlowElement
which may be casted
to the concrete type of the Bpmn Model Element currently executed.
If called from a Service ExecutionListener
, the method will return the corresponding FlowNode
for ExecutionListener.EVENTNAME_START
and ExecutionListener.EVENTNAME_END
and the corresponding
SequenceFlow
for ExecutionListener.EVENTNAME_TAKE
.
getBpmnModelElementInstance
in interface BpmnModelExecutionContext
FlowElement
corresponding to the current Bpmn Model Elementpublic BpmnModelInstance getBpmnModelInstance()
BpmnModelExecutionContext
BpmnModelInstance
for the currently executed Bpmn ModelgetBpmnModelInstance
in interface BpmnModelExecutionContext
BpmnModelInstance
public ProcessEngineServices getProcessEngineServices()
ProcessEngineServicesAware
ProcessEngineServices
providing access to the
public API of the process engine.getProcessEngineServices
in interface ProcessEngineServicesAware
ProcessEngineServices
.Copyright © 2015. All rights reserved.