/**
* Copyright 2004-2016 Riccardo Solmi. All rights reserved.
* This file is part of the Whole Platform.
*
* The Whole Platform is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The Whole Platform is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with the Whole Platform. If not, see <http://www.gnu.org/licenses/>.
*/
package org.whole.lang.workflows.util;
import static org.whole.lang.workflows.reflect.WorkflowsEntityDescriptorEnum.ArtifactsActivity;
import static org.whole.lang.workflows.reflect.WorkflowsEntityDescriptorEnum.CreateEntity;
import static org.whole.lang.workflows.reflect.WorkflowsEntityDescriptorEnum.CreateJavaClassInstance;
import static org.whole.lang.workflows.reflect.WorkflowsEntityDescriptorEnum.InvokeJavaClassMethod;
import static org.whole.lang.workflows.reflect.WorkflowsEntityDescriptorEnum.InvokeJavaInstanceMethod;
import static org.whole.lang.workflows.reflect.WorkflowsEntityDescriptorEnum.PersistenceActivity;
import static org.whole.lang.workflows.reflect.WorkflowsFeatureDescriptorEnum.className;
import static org.whole.lang.workflows.reflect.WorkflowsFeatureDescriptorEnum.constructor;
import static org.whole.lang.workflows.reflect.WorkflowsFeatureDescriptorEnum.entityName;
import static org.whole.lang.workflows.reflect.WorkflowsFeatureDescriptorEnum.method;
import static org.whole.lang.workflows.reflect.WorkflowsFeatureDescriptorEnum.persistence;
import static org.whole.lang.workflows.reflect.WorkflowsFeatureDescriptorEnum.resource;
import static org.whole.lang.workflows.reflect.WorkflowsFeatureDescriptorEnum.rootResource;
import org.whole.lang.java.util.JavaReflectUtils.JavaSignature;
import org.whole.lang.model.IEntity;
import org.whole.lang.reflect.EntityDescriptor;
import org.whole.lang.reflect.FeatureDescriptor;
import org.whole.lang.util.EntityUtils;
import org.whole.lang.workflows.model.ArtifactsActivity;
import org.whole.lang.workflows.model.PersistenceActivity;
/**
* @author Enrico Persiani
*/
public class WorkflowsUtils {
public static boolean isFeatureInActivity(IEntity entity, FeatureDescriptor fd, EntityDescriptor<?>... eds) {
if (!EntityUtils.hasParent(entity))
return false;
IEntity parent = entity.wGetParent();
EntityDescriptor<?> parentEd = parent.wGetEntityDescriptor();
boolean assignable = false;
for (int i = 0; i < eds.length; i++)
if (eds[i].isLanguageSupertypeOf(parentEd)) {
assignable = true;
break;
}
return assignable && parent.wGet(fd).equals(entity.wGetAdaptee(false));
}
public static boolean isPersistenceInPersistenceActivity(IEntity entity) {
return isFeatureInActivity(entity, persistence, PersistenceActivity);
}
public static boolean isResourceInArtifactsActivity(IEntity entity) {
return isFeatureInActivity(entity, rootResource, ArtifactsActivity) &&
EntityUtils.isImpl(((ArtifactsActivity) entity.wGetParent()).getRootResourceKind());
}
public static boolean isResourceInPersistenceActivity(IEntity entity) {
return isFeatureInActivity(entity, resource, PersistenceActivity) &&
EntityUtils.isNotResolver(((PersistenceActivity) entity.wGetParent()).getResourceKind());
}
public static boolean isSignatureInJavaActivity(IEntity entity) {
return isFeatureInActivity(entity, method, InvokeJavaClassMethod,
InvokeJavaInstanceMethod) || isFeatureInActivity(entity,
constructor, CreateJavaClassInstance);
}
public static boolean isClassNameInJavaActivity(IEntity entity) {
return isFeatureInActivity(entity, className, InvokeJavaClassMethod,
InvokeJavaInstanceMethod, CreateJavaClassInstance);
}
public static boolean isEntityTypeInCreateEntity(IEntity entity) {
return isFeatureInActivity(entity, entityName, CreateEntity);
}
public static String unparseCompact(JavaSignature signature) {
StringBuilder sb = new StringBuilder();
sb.append(signature.name);
sb.append('(');
int length = signature.types.length - (signature.isVarArgs ? 1 : 0);
for (int i = 0; i < length; i++) {
if (i>0)
sb.append(", ");
sb.append(signature.types[i].getSimpleName());
}
if (signature.isVarArgs) {
if (length>0)
sb.append(", ");
Class<?> type = signature.types[length];
sb.append(type.getComponentType().getSimpleName());
sb.append("...");
}
sb.append(')');
return sb.toString();
}
}