/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.isis.applib.services.command;
import java.sql.Timestamp;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicInteger;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.apache.isis.applib.annotation.Command.ExecuteIn;
import org.apache.isis.applib.annotation.Command.Persistence;
import org.apache.isis.applib.annotation.Programmatic;
import org.apache.isis.applib.services.bookmark.Bookmark;
import org.apache.isis.applib.services.eventbus.ActionDomainEvent;
import org.apache.isis.applib.services.eventbus.ActionInteractionEvent;
import org.apache.isis.applib.util.ObjectContracts;
public class CommandDefault implements Command3 {
//region > constructor
public CommandDefault() {
setExecutor(Executor.OTHER);
}
//endregion
//region > actionIdentifier (property)
private String actionIdentifier;
public String getMemberIdentifier() {
return actionIdentifier;
}
@Override
public void setMemberIdentifier(String actionIdentifier) {
this.actionIdentifier = actionIdentifier;
}
//endregion
//region > targetClass (property)
private String targetClass;
public String getTargetClass() {
return targetClass;
}
@Override
public void setTargetClass(String targetClass) {
this.targetClass = targetClass;
}
//endregion
//region > targetAction (property)
private String targetAction;
public String getTargetAction() {
return targetAction;
}
@Override
public void setTargetAction(String targetAction) {
this.targetAction = targetAction;
}
//endregion
//region > arguments (property)
private String arguments;
public String getArguments() {
return arguments;
}
@Override
public void setArguments(String arguments) {
this.arguments = arguments;
}
//endregion
//region > memento (property)
private String memento;
@Override
public String getMemento() {
return memento;
}
@Override
public void setMemento(String memento) {
this.memento = memento;
}
//endregion
//region > target (property)
private Bookmark target;
public Bookmark getTarget() {
return target;
}
@Override
public void setTarget(Bookmark target) {
this.target = target;
}
//endregion
//region > timestamp (property)
private Timestamp timestamp;
public Timestamp getTimestamp() {
return timestamp;
}
@Override
public void setTimestamp(Timestamp timestamp) {
this.timestamp = timestamp;
}
//endregion
//region > startedAt (property)
private Timestamp startedAt;
@Override
public Timestamp getStartedAt() {
return startedAt;
}
@Override
public void setStartedAt(Timestamp startedAt) {
this.startedAt = startedAt;
}
//endregion
//region > completedAt (property)
private Timestamp completedAt;
@Override
public Timestamp getCompletedAt() {
return completedAt;
}
@Override
public void setCompletedAt(final Timestamp completed) {
this.completedAt = completed;
}
//endregion
//region > user (property)
private String user;
public String getUser() {
return user;
}
@Override
public void setUser(String user) {
this.user = user;
}
//endregion
//region > actionInteractionEvent (peek/pop/flush)
@Deprecated
@Override
public ActionInteractionEvent<?> peekActionInteractionEvent() {
final ActionDomainEvent<?> actionDomainEvent = peekActionDomainEvent();
if (actionDomainEvent != null && !(actionDomainEvent instanceof ActionInteractionEvent)) {
throw new IllegalStateException("Most recently pushed event was not an instance of ActionInteractionEvent; use either ActionDomainEvent or the (deprecated) ActionInteractionEvent consistently");
}
return (ActionInteractionEvent<?>) actionDomainEvent;
}
@Deprecated
@Override
public void pushActionInteractionEvent(ActionInteractionEvent<?> event) {
pushActionDomainEvent(event);
}
@Deprecated
@Override
public ActionInteractionEvent popActionInteractionEvent() {
final ActionDomainEvent<?> actionDomainEvent = popActionDomainEvent();
if (actionDomainEvent != null && !(actionDomainEvent instanceof ActionInteractionEvent)) {
throw new IllegalStateException("Most recently pushed event was not an instance of ActionInteractionEvent; use either ActionDomainEvent or the (deprecated) ActionInteractionEvent consistently");
}
return (ActionInteractionEvent<?>) actionDomainEvent;
}
@Deprecated
@Programmatic
public List<ActionInteractionEvent<?>> flushActionInteractionEvents() {
final List<ActionDomainEvent<?>> actionDomainEvents = flushActionDomainEvents();
for (ActionDomainEvent<?> actionDomainEvent : actionDomainEvents) {
if (!(actionDomainEvent instanceof ActionInteractionEvent)) {
throw new IllegalStateException("List of events includes at least one event that is not an instance of ActionInteractionEvent; use either ActionDomainEvent or the (deprecated) ActionInteractionEvent consistently");
}
}
return (List)actionDomainEvents;
}
//endregion
//region > actionDomainEvent (peek/pop/flush)
private final LinkedList<ActionDomainEvent<?>> actionDomainEvents = Lists.newLinkedList();
@Override
public ActionDomainEvent<?> peekActionDomainEvent() {
return actionDomainEvents.isEmpty()? null: actionDomainEvents.getLast();
}
@Override
public void pushActionDomainEvent(ActionDomainEvent<?> event) {
if(peekActionDomainEvent() == event) {
return;
}
this.actionDomainEvents.add(event);
}
@Override
public ActionDomainEvent popActionDomainEvent() {
return !actionDomainEvents.isEmpty() ? actionDomainEvents.removeLast() : null;
}
@Programmatic
public List<ActionDomainEvent<?>> flushActionDomainEvents() {
final List<ActionDomainEvent<?>> events =
Collections.unmodifiableList(Lists.newArrayList(actionDomainEvents));
actionDomainEvents.clear();
return events;
}
//endregion
//region > executor (property)
private Executor executor;
@Override
public Executor getExecutor() {
return executor;
}
/**
* <b>NOT API</b>: intended to be called only by the framework.
*/
@Override
public void setExecutor(Executor nature) {
this.executor = nature;
}
//endregion
//region > executionType (property)
private ExecuteIn executionType;
@Override
public ExecuteIn getExecuteIn() {
return executionType;
}
/**
* <b>NOT API</b>: intended to be called only by the framework.
*/
@Override
public void setExecuteIn(ExecuteIn executionType) {
this.executionType = executionType;
}
//endregion
//region > parent (property)
private Command parent;
@Override
public Command getParent() {
return parent;
}
@Override
public void setParent(Command parent) {
this.parent = parent;
}
//endregion
//region > result (property)
private Bookmark result;
@Override
public Bookmark getResult() {
return result;
}
@Override
public void setResult(final Bookmark result) {
this.result = result;
}
//endregion
//region > exceptionStackTrace (property)
private String exceptionStackTrace;
@Override
public String getException() {
return exceptionStackTrace;
}
@Override
public void setException(final String exceptionStackTrace) {
this.exceptionStackTrace = exceptionStackTrace;
}
//endregion
//region > transactionId (property)
private UUID transactionId;
@Override
public UUID getTransactionId() {
return transactionId;
}
@Override
public void setTransactionId(UUID transactionId) {
this.transactionId = transactionId;
}
//endregion
//region > persistence
private Persistence persistence;
@Override
public Persistence getPersistence() {
return persistence;
}
@Override
public void setPersistence(Persistence persistence) {
this.persistence = persistence;
}
//endregion
//region > persistHint
private boolean persistHint;
public boolean isPersistHint() {
return persistHint;
}
public void setPersistHint(boolean persistHint) {
this.persistHint = persistHint;
}
//endregion
//region > next
private final Map<String, AtomicInteger> sequenceByName = Maps.newHashMap();
@Deprecated
@Override
public int next(String sequenceAbbr) {
AtomicInteger next = sequenceByName.get(sequenceAbbr);
if(next == null) {
next = new AtomicInteger(0);
sequenceByName.put(sequenceAbbr, next);
} else {
next.incrementAndGet();
}
return next.get();
}
//endregion
//region > toString
@Override
public String toString() {
return ObjectContracts.toString(this, "startedAt","user","memberIdentifier","target","transactionId");
}
//endregion
}