001/*
002 *  Licensed to the Apache Software Foundation (ASF) under one
003 *  or more contributor license agreements.  See the NOTICE file
004 *  distributed with this work for additional information
005 *  regarding copyright ownership.  The ASF licenses this file
006 *  to you under the Apache License, Version 2.0 (the
007 *  "License"); you may not use this file except in compliance
008 *  with the License.  You may obtain a copy of the License at
009 *
010 *        http://www.apache.org/licenses/LICENSE-2.0
011 *
012 *  Unless required by applicable law or agreed to in writing,
013 *  software distributed under the License is distributed on an
014 *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 *  KIND, either express or implied.  See the License for the
016 *  specific language governing permissions and limitations
017 *  under the License.
018 */
019
020package org.apache.isis.core.progmodel.facets.actions.invoke;
021
022import java.lang.reflect.Method;
023import java.util.Arrays;
024import java.util.List;
025
026import com.google.common.collect.Iterables;
027import com.google.common.collect.Lists;
028
029import org.apache.isis.applib.services.bookmark.Bookmark;
030import org.apache.isis.applib.services.bookmark.BookmarkService;
031import org.apache.isis.applib.services.memento.MementoService;
032import org.apache.isis.core.commons.lang.StringExtensions;
033import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
034import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
035import org.apache.isis.core.metamodel.adapter.oid.Oid;
036import org.apache.isis.core.metamodel.adapter.oid.RootOid;
037import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
038import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
039
040
041/**
042 * Factoring out the commonality between {@link ActionInvocationFacetViaMethod} and <tt>BackgroundServiceDefault</tt>.
043 */
044public class CommandUtil {
045
046    private CommandUtil(){}
047
048    public static String targetActionNameFor(ObjectAction owningAction) {
049        return owningAction.getName();
050    }
051
052    public static String targetClassNameFor(ObjectAdapter targetAdapter) {
053        return StringExtensions.asNaturalName2(targetAdapter.getSpecification().getSingularName());
054    }
055
056    public static String actionIdentifierFor(ObjectAction owningAction) {
057        return owningAction.getIdentifier().toClassAndNameIdentityString();
058    }
059
060    public static String argDescriptionFor(ObjectAction owningAction, ObjectAdapter[] arguments) {
061        final StringBuilder argsBuf = new StringBuilder();
062        List<ObjectActionParameter> parameters = owningAction.getParameters();
063        if(parameters.size() == arguments.length) {
064            // should be the case
065            int i=0;
066            for (ObjectActionParameter param : parameters) {
067                CommandUtil.appendParamArg(argsBuf, param, arguments[i++]);
068            }
069        }
070        String argsStr = argsBuf.toString();
071        return argsStr;
072    }
073
074    public static Bookmark bookmarkFor(final ObjectAdapter adapter) {
075        final Oid oid = adapter.getOid();
076        if(!(oid instanceof RootOid)) {
077            return null;
078        } 
079        final RootOid rootOid = (RootOid) oid;
080        return rootOid.asBookmark();
081    }
082
083    static void appendParamArg(final StringBuilder buf, ObjectActionParameter param, ObjectAdapter objectAdapter) {
084        String titleOf = objectAdapter != null? objectAdapter.titleString(null): "null";
085        buf.append(param.getName()).append(": ").append(titleOf).append("\n");
086    }
087
088    public static void buildMementoArgLists(MementoService mementoService, BookmarkService bookmarkService, final Method method, final Object[] args, final List<Class<?>> argTypes, final List<Object> argObjs) {
089        for (int i = 0; i < args.length; i++) {
090            Object input = args[i];
091            if (mementoService.canSet(input)) {
092                argTypes.add(method.getParameterTypes()[i]);
093                argObjs.add(input);
094            } else {
095                Bookmark argBookmark = bookmarkService.bookmarkFor(input);
096                argTypes.add(Bookmark.class);
097                argObjs.add(argBookmark);
098            }
099        }
100    }
101    
102    
103    public static ObjectAdapter[] adaptersFor(final Object[] args, final AdapterManager adapterManager) {
104        List<Object> argList = Arrays.asList(args);
105        Iterable<ObjectAdapter> adapterList = 
106                Iterables.transform(
107                        argList, ObjectAdapter.Functions.adapterForUsing(adapterManager));
108        return Lists.newArrayList(adapterList).toArray(new ObjectAdapter[]{});
109    }
110
111    public static Object[] objectsFor(ObjectAdapter[] arguments) {
112        List<ObjectAdapter> argList = Arrays.asList(arguments);
113        Iterable<Object> adapterList = 
114                Iterables.transform(
115                        argList, ObjectAdapter.Functions.getObject());
116        return Lists.newArrayList(adapterList).toArray(new Object[]{});
117    }
118
119    
120}