/*
* 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.nof.reflect.remote.spec;
import org.apache.isis.noa.adapter.ObjectAdapter;
import org.apache.isis.noa.adapter.ObjectAdapterReference;
import org.apache.isis.noa.facets.Facet;
import org.apache.isis.metamodel.facets.actions.debug.DebugFacet;
import org.apache.isis.metamodel.facets.actions.executed.ExecutedFacet;
import org.apache.isis.metamodel.facets.actions.exploration.ExplorationFacet;
import org.apache.isis.noa.reflect.Consent;
import org.apache.isis.noa.reflect.ObjectAction;
import org.apache.isis.noa.reflect.ObjectActionParameter;
import org.apache.isis.noa.reflect.ObjectActionParameter.Filter;
import org.apache.isis.noa.spec.ObjectSpecification;
import org.apache.isis.nof.core.context.IsisContext;
import org.apache.isis.nof.core.reflect.Allow;
import org.apache.isis.nof.core.util.NameConvertor;
import org.apache.isis.nof.core.util.NotImplementedException;
import org.apache.isis.nof.reflect.peer.ActionPeer;
import org.apache.isis.nof.reflect.peer.MemberIdentifier;
import org.apache.isis.nof.reflect.spec.DefaultOneToOneActionParameter;
import org.apache.isis.nof.reflect.spec.DefaultValueActionParameter;
import org.apache.isis.testing.TestSession;
public class DummyAction implements ObjectAction {
public final ActionPeer peer;
public DummyAction(final ActionPeer peer) {
this.peer = peer;
}
public boolean[] canParametersWrap() {
return null;
}
public String debugData() {
return "";
}
public ObjectAdapter execute(final ObjectAdapterReference object, final ObjectAdapter[] parameters) {
return peer.execute(object, parameters);
}
public ObjectAction[] getActions() {
return new ObjectAction[0];
}
public ObjectAdapter[] getDefaultParameterValues(ObjectAdapterReference target) {
throw new NotImplementedException();
}
public String getDescription() {
return "";
}
public Facet getFacet(final Class cls) {
return null;
}
public Class[] getFacetTypes() {
return new Class[0];
}
public Facet[] getFacets(Facet.Filter filter) {
return new Facet[]{};
}
public void addFacet(Facet facet) {
}
public void removeFacet(Facet facet) {
}
public String getHelp() {
return "";
}
public String getId() {
return NameConvertor.simpleName(peer.getIdentifier().getName());
}
public MemberIdentifier getIdentifier() {
throw new NotImplementedException();
}
public String getName() {
return "";
}
public ObjectSpecification getOnType() {
return peer.getOnType();
}
public ObjectAdapter[][] getOptions(ObjectAdapterReference target) {
return null;
}
public int getParameterCount() {
return peer.getParameterCount();
}
public String[] getParameterDescriptions() {
return null;
}
public int[] getParameterMaxLengths() {
return null;
}
public String[] getParameterNames() {
return new String[]{};
}
public int[] getParameterNoLines() {
return null;
}
/**
* Build lazily by {@link #getParameters()}.
*/
private ObjectActionParameter[] parameters;
public ObjectActionParameter[] getParameters() {
if (parameters == null) {
parameters = new ObjectActionParameter[getParameterCount()];
ObjectSpecification[] parameterTypes = getParameterTypes();
String[] parameterNames = getParameterNames();
String[] parameterDescriptions = getParameterDescriptions();
boolean[] optionalParameters = getOptionalParameters();
int[] parameterNoLines = getParameterNoLines();
boolean[] canParametersWrap = canParametersWrap();
int[] parameterMaxLengths = getParameterMaxLengths();
int[] parameterTypicalLengths = getParameterTypicalLengths();
for(int i=0; i<getParameterCount(); i++) {
if (parameterTypes[i].getType() == ObjectSpecification.VALUE) {
parameters[i] = new DefaultValueActionParameter(
i,
this,
null,
parameterTypes[i],
parameterNames[i], parameterDescriptions[i],
optionalParameters[i],
parameterTypicalLengths[i], parameterMaxLengths[i],
parameterNoLines[i], canParametersWrap[i]);
} else if (parameterTypes[i].getType() == ObjectSpecification.OBJECT) {
parameters[i] = new DefaultOneToOneActionParameter(
i,
this,
null,
parameterTypes[i],
parameterNames[i], parameterDescriptions[i],
optionalParameters[i]);
} else if (parameterTypes[i].getType() == ObjectSpecification.COLLECTION) {
// TODO: not supported; should we throw an exception of some sort here?
parameters[i] = null;
}
}
}
return parameters;
}
public ObjectActionParameter[] getParameters(
Filter filter) {
ObjectActionParameter[] allParameters = getParameters();
ObjectActionParameter[] selectedParameters = new ObjectActionParameter[allParameters.length];
int v = 0;
for (int i = 0; i < allParameters.length; i++) {
if (filter.accept(allParameters[i])) {
selectedParameters[v++] = allParameters[i];
}
}
ObjectActionParameter[] parameters = new ObjectActionParameter[v];
System.arraycopy(selectedParameters, 0, parameters, 0, v);
return parameters;
}
// public ObjectSpecification[] getParameterTypes() {
// return peer.getParameterTypes();
// }
public int[] getParameterTypicalLengths() {
return null;
}
// public boolean[] getOptionalParameters() {
// return peer.getOptionalParameters();
// }
public ObjectSpecification getReturnType() {
return peer.getReturnType();
}
public Target getTarget() {
ExecutedFacet executedFacet = (ExecutedFacet) peer.getFacet(ExecutedFacet.class);
return executedFacet == null?ObjectAction.DEFAULT:executedFacet.getTarget();
}
public Type getType() {
DebugFacet debugFacet = (DebugFacet) peer.getFacet(DebugFacet.class);
if (debugFacet != null) {
return ObjectAction.DEBUG;
}
ExplorationFacet explorationFacet = (ExplorationFacet) peer.getFacet(ExplorationFacet.class);
if (explorationFacet != null) {
return ObjectAction.EXPLORATION;
}
return ObjectAction.USER;
}
public boolean hasReturn() {
return false;
}
public boolean isOnInstance() {
return peer.isOnInstance();
}
/**
* Delegates to {@link #isParameterSetValidDeclaratively(ObjectAdapterReference, ObjectAdapter[])} and
* then {@link #isParameterSetValidImperatively(ObjectAdapterReference, ObjectAdapter[])}, as per the
* contract in the {@link ObjectAction implemented interface}.
*/
public Consent isParameterSetValid(final ObjectAdapterReference object,
final ObjectAdapter[] parameters) {
Consent consentDeclaratively = isParameterSetValidDeclaratively(object, parameters);
if (consentDeclaratively.isVetoed()) {
return consentDeclaratively;
}
return isParameterSetValidImperatively(object, parameters);
}
/**
* Always returns an {@link Allow}.
*/
public Consent isParameterSetValidDeclaratively(
ObjectAdapterReference object,
ObjectAdapter[] parameters) {
return Allow.DEFAULT;
}
public Consent isParameterSetValidImperatively(
ObjectAdapterReference object,
ObjectAdapter[] parameters) {
return peer.isParameterSetValidImperatively(object, parameters);
}
public Consent isUsable(final ObjectAdapterReference target) {
return peer.isUsable(target);
}
public Consent isUsable() {
Consent usableDeclaratively = isUsableDeclaratively();
if (usableDeclaratively.isVetoed()) {
return usableDeclaratively;
}
return isUsableForSession();
}
public Consent isUsableDeclaratively() {
return peer.isUsableDeclaratively();
}
public Consent isUsableForSession() {
return peer.isUsableForSession(IsisContext.getSession());
}
public boolean isContributedMethodWithSuitableParameter() {
return false;
}
public boolean isVisible() {
return isVisibleDeclaratively() && isVisibleForSession();
}
public boolean isVisibleDeclaratively() {
return peer.isVisibleDeclaratively();
}
public boolean isVisibleForSession() {
return peer.isVisibleForSession(new TestSession());
}
public boolean isVisible(final ObjectAdapterReference target) {
return peer.isVisible(target);
}
public ObjectAdapter[] parameterStubs() {
throw new NotImplementedException();
}
public ObjectAdapterReference realTarget(ObjectAdapterReference target) {
return target;
}
public ObjectSpecification getSpecification() {
return null;
}
}