/**
* 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.background;
import java.util.Iterator;
import java.util.List;
import org.apache.isis.applib.services.bookmark.Bookmark;
import org.apache.isis.applib.services.memento.MementoService;
import org.apache.isis.applib.services.memento.MementoService.Memento;
import org.apache.isis.schema.cmd.v1.CommandDto;
/**
* A memento for an action invocation, to allow the details of an action invocation
* to be captured and stored, then executed later.
*
* <p>
* Provided as a mechanism by which implementations of {@link BackgroundService} can
* hand-off work to the {@link BackgroundCommandService}. This is used by the
* default implementation of <tt>BackgroundServiceDefault</tt> in the <tt>isis-module-background</tt> module.
* </p>
*
* <p>
* Implementation-wise this is a wrapper around {@link MementoService.Memento},
* and abstracts away the details of the keys used to store the various pieces of
* information stored in the underlying memento.
* </p>
*
* <p>
* Note that this class - unlike {@link CommandDto} does <i>not</i> support mixins.
* </p>
*
* @deprecated - use {@link CommandDto} instead.
*/
@Deprecated
public class ActionInvocationMemento {
private final Memento memento;
public ActionInvocationMemento(
final MementoService mementoService,
final String actionId,
final Bookmark target,
final List<Class<?>> argTypes,
final List<Object> args) {
if(argTypes.size() != args.size()) {
throw new IllegalArgumentException("argTypes and args must be same size");
}
this.memento = mementoService.create();
memento.set("actionId", actionId);
memento.set("target", target);
memento.set("numArgs", args.size());
final Iterator<Class<?>> iterArgTypes = argTypes.iterator();
final Iterator<Object> iterArgs = args.iterator();
int i=0;
while(iterArgTypes.hasNext() && iterArgs.hasNext()) {
memento.set("arg" + i + "Type", iterArgTypes.next().getName());
memento.set("arg" + i , iterArgs.next());
i++;
}
}
public ActionInvocationMemento(final MementoService mementoService, final String mementoStr) {
this.memento = mementoService.parse(mementoStr);
}
// //////////////////////////////////////
public String getActionId() {
return memento.get("actionId", String.class);
}
/**
* @deprecated - always returns <tt>null</tt>; use {@link #getActionId()} instead.
*/
@Deprecated
public String getTargetClassName() {
return memento.get("targetClassName", String.class);
}
/**
* @deprecated - always returns <tt>null</tt>; use {@link #getActionId()} instead.
*/
@Deprecated
public String getTargetActionName() {
return memento.get("targetActionName", String.class);
}
public Bookmark getTarget() {
return memento.get("target", Bookmark.class);
}
public int getNumArgs() {
return memento.get("numArgs", Integer.class);
}
public Class<?> getArgType(final int num) throws ClassNotFoundException {
String className = memento.get("arg" + num + "Type", String.class);
if(className.equals("byte")) return byte.class;
if(className.equals("short")) return short.class;
if(className.equals("int")) return int.class;
if(className.equals("long")) return long.class;
if(className.equals("float")) return float.class;
if(className.equals("double")) return double.class;
if(className.equals("char")) return char.class;
if(className.equals("boolean")) return boolean.class;
return className != null? Thread.currentThread().getContextClassLoader().loadClass(className): null;
}
public <T> T getArg(final int num, final Class<T> type) {
return memento.get("arg" + num, type);
}
// //////////////////////////////////////
public String asMementoString() {
return memento.asString();
}
// //////////////////////////////////////
@Override
public String toString() {
return asMementoString();
}
}