You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2013/09/04 03:04:46 UTC
[2/2] git commit: ISIS-503: store contributee members along with
regular members
ISIS-503: store contributee members along with regular members
- ie refactor how they are calculated
also:
- more refactorings of the overloads of getAssociations and getObjectActions
- rename "properties" to "metadataProperties" and convert to a field (in order to make available for sorting contributee actions later on when calculated and saved)
- rename "layoutProperties(...)" to "metadataProperties(...)"
Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/242739ad
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/242739ad
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/242739ad
Branch: refs/heads/master
Commit: 242739ad6af3670bb443abfa3deac2c5a5ed8d1b
Parents: 02340bf
Author: Dan Haywood <da...@apache.org>
Authored: Wed Sep 4 00:42:54 2013 +0100
Committer: Dan Haywood <da...@apache.org>
Committed: Wed Sep 4 00:42:54 2013 +0100
----------------------------------------------------------------------
.../core/metamodel/facets/FacetFactory.java | 57 ++++--
.../specloader/ObjectReflectorDefault.java | 8 +-
.../facetprocessor/FacetProcessor.java | 35 +++-
.../specimpl/FacetedMethodsBuilder.java | 74 ++++---
.../specimpl/ObjectSpecificationAbstract.java | 194 ++++++++++++-------
.../dflt/ObjectSpecificationDefault.java | 97 ++--------
.../members/order/MemberOrderFacetFactory.java | 2 +-
.../MemberGroupLayoutFacetFactory.java | 2 +-
8 files changed, 262 insertions(+), 207 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/isis/blob/242739ad/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactory.java
index 55ab363..7048ec6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/FacetFactory.java
@@ -55,11 +55,16 @@ public interface FacetFactory {
* the meta-model.
*/
List<FeatureType> getFeatureTypes();
+
+
+ // //////////////////////////////////////
+ // process class
+ // //////////////////////////////////////
public static class ProcessClassContext extends AbstractProcessContext<FacetHolder> implements MethodRemover {
private final Class<?> cls;
private final MethodRemover methodRemover;
- private final Properties properties;
+ private final Properties metadataProperties;
/**
* For testing only.
@@ -68,11 +73,15 @@ public interface FacetFactory {
this(cls, null, methodRemover, facetHolder);
}
- public ProcessClassContext(final Class<?> cls, final Properties properties, final MethodRemover methodRemover, final FacetHolder facetHolder) {
+ public ProcessClassContext(
+ final Class<?> cls,
+ final Properties metadataProperties,
+ final MethodRemover methodRemover,
+ final FacetHolder facetHolder) {
super(facetHolder);
this.cls = cls;
this.methodRemover = methodRemover;
- this.properties = properties;
+ this.metadataProperties = metadataProperties;
}
/**
@@ -102,11 +111,11 @@ public interface FacetFactory {
methodRemover.removeMethods(methods);
}
- public Properties layoutProperties(String prefix) {
- if(properties == null) {
+ public Properties metadataProperties(String prefix) {
+ if(metadataProperties == null) {
return null;
}
- final Properties subsetProperties = PropertyUtil.subset(this.properties, prefix);
+ final Properties subsetProperties = PropertyUtil.subset(this.metadataProperties, prefix);
return !subsetProperties.isEmpty() ? subsetProperties : null;
}
}
@@ -115,19 +124,30 @@ public interface FacetFactory {
* Process the class, and return the correctly setup annotation if present.
*/
void process(ProcessClassContext processClassContext);
+
+ // //////////////////////////////////////
+ // process method
+ // //////////////////////////////////////
+
public static class ProcessMethodContext extends AbstractProcessContext<FacetedMethod> implements MethodRemover {
private final Class<?> cls;
private final FeatureType featureType;
- private final Properties properties;
+ private final Properties metadataProperties;
private final Method method;
private final MethodRemover methodRemover;
- public ProcessMethodContext(final Class<?> cls, FeatureType featureType, Properties properties, final Method method, final MethodRemover methodRemover, final FacetedMethod facetedMethod) {
+ public ProcessMethodContext(
+ final Class<?> cls,
+ final FeatureType featureType,
+ final Properties metadataProperties,
+ final Method method,
+ final MethodRemover methodRemover,
+ final FacetedMethod facetedMethod) {
super(facetedMethod);
this.cls = cls;
this.featureType = featureType;
- this.properties = properties;
+ this.metadataProperties = metadataProperties;
this.method = method;
this.methodRemover = methodRemover;
}
@@ -160,9 +180,9 @@ public interface FacetFactory {
methodRemover.removeMethods(methods);
}
- public Properties layoutProperties(String prefix) {
+ public Properties metadataProperties(String prefix) {
- if(properties == null) {
+ if(metadataProperties == null) {
return null;
}
Identifier identifier = featureType.identifierFor(getCls(), getMethod());
@@ -171,15 +191,14 @@ public interface FacetFactory {
// bit of a hack; to distinguish between actions and properties that have same identifier
// eg getPaidBy() and paidBy()
if(featureType.isAction()) {
- Properties subsetProperties = PropertyUtil.subset(this.properties, prefix+"."+id+"()");
+ Properties subsetProperties = PropertyUtil.subset(this.metadataProperties, prefix+"."+id+"()");
if (!subsetProperties.isEmpty()) {
return subsetProperties;
}
-
}
// otherwise, regular processing...
- Properties subsetProperties = PropertyUtil.subset(this.properties, prefix+"."+id);
+ Properties subsetProperties = PropertyUtil.subset(this.metadataProperties, prefix+"."+id);
if (!subsetProperties.isEmpty()) {
return subsetProperties;
}
@@ -193,11 +212,19 @@ public interface FacetFactory {
*/
void process(ProcessMethodContext processMethodContext);
+
+ // //////////////////////////////////////
+ // process param
+ // //////////////////////////////////////
+
public static class ProcessParameterContext extends AbstractProcessContext<FacetedMethodParameter> {
private final Method method;
private final int paramNum;
- public ProcessParameterContext(final Method method, final int paramNum, final FacetedMethodParameter facetedMethodParameter) {
+ public ProcessParameterContext(
+ final Method method,
+ final int paramNum,
+ final FacetedMethodParameter facetedMethodParameter) {
super(facetedMethodParameter);
this.method = method;
this.paramNum = paramNum;
http://git-wip-us.apache.org/repos/asf/isis/blob/242739ad/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
index a8da35e..35e49fd 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/ObjectReflectorDefault.java
@@ -528,13 +528,7 @@ public final class ObjectReflectorDefault implements SpecificationLoaderSpi, App
final AuthenticationSessionProvider authenticationSessionProvider = getRuntimeContext().getAuthenticationSessionProvider();
final SpecificationLoader specificationLookup = getRuntimeContext().getSpecificationLoader();
- final ServicesProvider servicesProvider = getRuntimeContext().getServicesProvider();/* new ServicesProviderAbstract(){
-
- @Override
- public List<ObjectAdapter> getServices() {
- return ObjectReflectorDefault.this.services;
- }
- };*/
+ final ServicesProvider servicesProvider = getRuntimeContext().getServicesProvider();
final ObjectInstantiator objectInstantiator = getRuntimeContext().getObjectInstantiator();
// create contexts as inputs ...
http://git-wip-us.apache.org/repos/asf/isis/blob/242739ad/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/facetprocessor/FacetProcessor.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/facetprocessor/FacetProcessor.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/facetprocessor/FacetProcessor.java
index f6a80de..0ba8a87 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/facetprocessor/FacetProcessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/facetprocessor/FacetProcessor.java
@@ -276,19 +276,26 @@ public class FacetProcessor implements RuntimeContextAware {
* - class to process
* @param facetHolder
* - holder to attach facets to.
- *
*/
- public void process(final Class<?> cls, final Properties properties, final MethodRemover methodRemover, final FacetHolder facetHolder) {
+ public void process(
+ final Class<?> cls,
+ final Properties metadataProperties,
+ final MethodRemover methodRemover,
+ final FacetHolder facetHolder) {
final List<FacetFactory> factoryList = getFactoryListByFeatureType(FeatureType.OBJECT);
for (final FacetFactory facetFactory : factoryList) {
- facetFactory.process(new ProcessClassContext(cls, properties, removerElseNullRemover(methodRemover), facetHolder));
+ facetFactory.process(new ProcessClassContext(cls, metadataProperties, removerElseNullRemover(methodRemover), facetHolder));
}
}
- public void processPost(final Class<?> cls, Properties properties, final MethodRemover methodRemover, final FacetHolder facetHolder) {
+ public void processPost(
+ final Class<?> cls,
+ final Properties metadataProperties,
+ final MethodRemover methodRemover,
+ final FacetHolder facetHolder) {
final List<FacetFactory> factoryList = getFactoryListByFeatureType(FeatureType.OBJECT_POST_PROCESSING);
for (final FacetFactory facetFactory : factoryList) {
- facetFactory.process(new ProcessClassContext(cls, properties, removerElseNullRemover(methodRemover), facetHolder));
+ facetFactory.process(new ProcessClassContext(cls, metadataProperties, removerElseNullRemover(methodRemover), facetHolder));
}
}
@@ -313,12 +320,19 @@ public class FacetProcessor implements RuntimeContextAware {
* @param featureType
* - what type of feature the method represents (property,
* action, collection etc)
- * @param properties TODO
+ * @param metadataProperties
+ * - additional properties to parse and use
*/
- public void process(final Class<?> cls, final Method method, final MethodRemover methodRemover, final FacetedMethod facetedMethod, final FeatureType featureType, Properties properties) {
+ public void process(
+ final Class<?> cls,
+ final Method method,
+ final MethodRemover methodRemover,
+ final FacetedMethod facetedMethod,
+ final FeatureType featureType,
+ final Properties metadataProperties) {
final List<FacetFactory> factoryList = getFactoryListByFeatureType(featureType);
for (final FacetFactory facetFactory : factoryList) {
- facetFactory.process(new ProcessMethodContext(cls, featureType, properties, method, removerElseNullRemover(methodRemover), facetedMethod));
+ facetFactory.process(new ProcessMethodContext(cls, featureType, metadataProperties, method, removerElseNullRemover(methodRemover), facetedMethod));
}
}
@@ -340,7 +354,10 @@ public class FacetProcessor implements RuntimeContextAware {
* @param facetedMethodParameter
* - holder to attach facets to.
*/
- public void processParams(final Method method, final int paramNum, final FacetedMethodParameter facetedMethodParameter) {
+ public void processParams(
+ final Method method,
+ final int paramNum,
+ final FacetedMethodParameter facetedMethodParameter) {
final List<FacetFactory> factoryList = getFactoryListByFeatureType(FeatureType.ACTION_PARAMETER);
for (final FacetFactory facetFactory : factoryList) {
facetFactory.processParams(new ProcessParameterContext(method, paramNum, facetedMethodParameter));
http://git-wip-us.apache.org/repos/asf/isis/blob/242739ad/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
index 06cbf9d..38b62ef 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/FacetedMethodsBuilder.java
@@ -176,8 +176,6 @@ public class FacetedMethodsBuilder {
// ////////////////////////////////////////////////////////////////////////////
-
-
public Properties introspectClass() {
LOG.info("introspecting " + getClassName());
if (LOG.isDebugEnabled()) {
@@ -187,9 +185,9 @@ public class FacetedMethodsBuilder {
// process facets at object level
// this will also remove some methods, such as the superclass methods.
- Properties properties = layoutMetadataProperties(introspectedClass);
+ final Properties metadataProperties = readMetadataProperties(introspectedClass);
- getFacetProcessor().process(introspectedClass, properties, methodRemover, spec);
+ getFacetProcessor().process(introspectedClass, metadataProperties, methodRemover, spec);
// if this class has additional facets (as per @Facets), then process
// them.
@@ -206,10 +204,10 @@ public class FacetedMethodsBuilder {
throw new IsisException(e);
}
getFacetProcessor().injectDependenciesInto(facetFactory);
- facetFactory.process(new ProcessClassContext(introspectedClass, properties, methodRemover, spec));
+ facetFactory.process(new ProcessClassContext(introspectedClass, metadataProperties, methodRemover, spec));
}
}
- return properties;
+ return metadataProperties;
}
/**
@@ -218,10 +216,10 @@ public class FacetedMethodsBuilder {
* <p>
* Not doing for now, though, because expect the {@link LayoutMetadata} to evolve a bit yet.
*/
- private Properties layoutMetadataProperties(Class<?> domainClass) {
+ private Properties readMetadataProperties(Class<?> domainClass) {
List<LayoutMetadataReader> layoutMetadataReaders =
Lists.<LayoutMetadataReader>newArrayList(new LayoutMetadataReaderFromJson(), new LayoutMetadataReaderFromJson());
- for (LayoutMetadataReader reader : layoutMetadataReaders) {
+ for (final LayoutMetadataReader reader : layoutMetadataReaders) {
try {
Properties properties = reader.asProperties(domainClass);
if(properties != null) {
@@ -353,11 +351,10 @@ public class FacetedMethodsBuilder {
/**
* Returns a {@link List} of {@link FacetedMethod}s representing object
* actions, lazily creating them first if required.
- * @param properties TODO
*/
- public List<FacetedMethod> getActionFacetedMethods(Properties properties) {
+ public List<FacetedMethod> getActionFacetedMethods(final Properties metadataProperties) {
if (actionFacetedMethods == null) {
- actionFacetedMethods = findActionFacetedMethods(MethodScope.OBJECT, properties);
+ actionFacetedMethods = findActionFacetedMethods(MethodScope.OBJECT, metadataProperties);
}
return actionFacetedMethods;
}
@@ -374,18 +371,23 @@ public class FacetedMethodsBuilder {
*
* <p>
* Perhaps it's important to skip helpers first. I doubt it, though.
- * @param properties TODO
*/
- private List<FacetedMethod> findActionFacetedMethods(final MethodScope methodScope, Properties properties) {
+ private List<FacetedMethod> findActionFacetedMethods(
+ final MethodScope methodScope,
+ final Properties metadataProperties) {
if (LOG.isDebugEnabled()) {
LOG.debug("introspecting " + getClassName() + ": actions");
}
- final List<FacetedMethod> actionFacetedMethods1 = findActionFacetedMethods(methodScope, RecognisedHelpersStrategy.SKIP, properties);
- final List<FacetedMethod> actionFacetedMethods2 = findActionFacetedMethods(methodScope, RecognisedHelpersStrategy.DONT_SKIP, properties);
+ final List<FacetedMethod> actionFacetedMethods1 = findActionFacetedMethods(methodScope, RecognisedHelpersStrategy.SKIP, metadataProperties);
+ final List<FacetedMethod> actionFacetedMethods2 = findActionFacetedMethods(methodScope, RecognisedHelpersStrategy.DONT_SKIP, metadataProperties);
return ListUtils.combine(actionFacetedMethods1, actionFacetedMethods2);
}
- private List<FacetedMethod> findActionFacetedMethods(final MethodScope methodScope, final RecognisedHelpersStrategy recognisedHelpersStrategy, Properties properties) {
+ private List<FacetedMethod> findActionFacetedMethods(
+ final MethodScope methodScope,
+ final RecognisedHelpersStrategy recognisedHelpersStrategy,
+ final Properties metadataProperties) {
+
if (LOG.isDebugEnabled()) {
LOG.debug(" looking for action methods");
}
@@ -397,7 +399,7 @@ public class FacetedMethodsBuilder {
if (method == null) {
continue;
}
- final FacetedMethod actionPeer = findActionMethodPeer(methodScope, recognisedHelpersStrategy, method, properties);
+ final FacetedMethod actionPeer = findActionFacetedMethod(methodScope, recognisedHelpersStrategy, method, metadataProperties);
if (actionPeer != null) {
methods.set(i, null);
actionFacetedMethods.add(actionPeer);
@@ -407,17 +409,24 @@ public class FacetedMethodsBuilder {
return actionFacetedMethods;
}
- private FacetedMethod findActionMethodPeer(final MethodScope methodScope, final RecognisedHelpersStrategy recognisedHelpersStrategy, final Method actionMethod, Properties properties) {
+ private FacetedMethod findActionFacetedMethod(
+ final MethodScope methodScope,
+ final RecognisedHelpersStrategy recognisedHelpersStrategy,
+ final Method actionMethod,
+ final Properties metadataProperties) {
if (!representsAction(actionMethod, methodScope, recognisedHelpersStrategy)) {
return null;
}
// build action
- return createActionFacetedMethod(actionMethod, properties);
+ return createActionFacetedMethod(actionMethod, metadataProperties);
}
- private FacetedMethod createActionFacetedMethod(final Method actionMethod, Properties properties) {
+ private FacetedMethod createActionFacetedMethod(
+ final Method actionMethod,
+ final Properties metadataProperties) {
+
if (!isAllParamTypesValid(actionMethod)) {
return null;
}
@@ -425,7 +434,7 @@ public class FacetedMethodsBuilder {
final FacetedMethod action = FacetedMethod.createForAction(introspectedClass, actionMethod);
// process facets on the action & parameters
- getFacetProcessor().process(introspectedClass, actionMethod, methodRemover, action, FeatureType.ACTION, properties);
+ getFacetProcessor().process(introspectedClass, actionMethod, methodRemover, action, FeatureType.ACTION, metadataProperties);
final List<FacetedMethodParameter> actionParams = action.getParameters();
for (int j = 0; j < actionParams.size(); j++) {
@@ -445,7 +454,10 @@ public class FacetedMethodsBuilder {
return true;
}
- private boolean representsAction(final Method actionMethod, final MethodScope methodScope, final RecognisedHelpersStrategy recognisedHelpersStrategy) {
+ private boolean representsAction(
+ final Method actionMethod,
+ final MethodScope methodScope,
+ final RecognisedHelpersStrategy recognisedHelpersStrategy) {
if (!MethodFinderUtils.inScope(methodScope, actionMethod)) {
return false;
@@ -502,12 +514,12 @@ public class FacetedMethodsBuilder {
// introspect class post processing
// ////////////////////////////////////////////////////////////////////////////
- public void introspectClassPostProcessing(Properties properties) {
+ public void introspectClassPostProcessing(final Properties metadataProperties) {
if (LOG.isDebugEnabled()) {
LOG.debug("introspecting " + getClassName() + ": class-level post-processing");
}
- getFacetProcessor().processPost(introspectedClass, properties, methodRemover, spec);
+ getFacetProcessor().processPost(introspectedClass, metadataProperties, methodRemover, spec);
}
// ////////////////////////////////////////////////////////////////////////////
@@ -519,7 +531,12 @@ public class FacetedMethodsBuilder {
* {@link #findAndRemovePrefixedNonVoidMethods(boolean, String, Class, int)}
* , but appends to provided {@link List} (collecting parameter pattern).
*/
- private void findAndRemovePrefixedNonVoidMethods(final MethodScope methodScope, final String prefix, final Class<?> returnType, final int paramCount, final List<Method> methodListToAppendTo) {
+ private void findAndRemovePrefixedNonVoidMethods(
+ final MethodScope methodScope,
+ final String prefix,
+ final Class<?> returnType,
+ final int paramCount,
+ final List<Method> methodListToAppendTo) {
final List<Method> matchingMethods = findAndRemovePrefixedMethods(methodScope, prefix, returnType, false, paramCount);
methodListToAppendTo.addAll(matchingMethods);
}
@@ -533,7 +550,12 @@ public class FacetedMethodsBuilder {
* @see MethodFinderUtils#removeMethods(Method[], boolean, String, Class,
* boolean, int, ClassSubstitutor)
*/
- private List<Method> findAndRemovePrefixedMethods(final MethodScope methodScope, final String prefix, final Class<?> returnType, final boolean canBeVoid, final int paramCount) {
+ private List<Method> findAndRemovePrefixedMethods(
+ final MethodScope methodScope,
+ final String prefix,
+ final Class<?> returnType,
+ final boolean canBeVoid,
+ final int paramCount) {
return MethodFinderUtils.removeMethods(methods, methodScope, prefix, returnType, canBeVoid, paramCount);
}
http://git-wip-us.apache.org/repos/asf/isis/blob/242739ad/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
index ce2608c..58ece62 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
@@ -39,6 +39,7 @@ import org.apache.isis.applib.filter.Filters;
import org.apache.isis.applib.profiles.Localization;
import org.apache.isis.core.commons.authentication.AuthenticationSession;
import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
+import org.apache.isis.core.commons.exceptions.UnknownTypeException;
import org.apache.isis.core.commons.lang.JavaClassUtils;
import org.apache.isis.core.commons.lang.ToString;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
@@ -63,6 +64,7 @@ import org.apache.isis.core.metamodel.facets.object.dirty.MarkDirtyObjectFacet;
import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
import org.apache.isis.core.metamodel.facets.object.icon.IconFacet;
import org.apache.isis.core.metamodel.facets.object.immutable.ImmutableFacet;
+import org.apache.isis.core.metamodel.facets.object.membergroups.MemberGroupLayoutFacet;
import org.apache.isis.core.metamodel.facets.object.notpersistable.NotPersistableFacet;
import org.apache.isis.core.metamodel.facets.object.objecttype.ObjectSpecIdFacet;
import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
@@ -74,6 +76,7 @@ import org.apache.isis.core.metamodel.interactions.InteractionContext;
import org.apache.isis.core.metamodel.interactions.InteractionUtils;
import org.apache.isis.core.metamodel.interactions.ObjectTitleContext;
import org.apache.isis.core.metamodel.interactions.ObjectValidityContext;
+import org.apache.isis.core.metamodel.layout.DeweyOrderSet;
import org.apache.isis.core.metamodel.spec.ActionType;
import org.apache.isis.core.metamodel.spec.Instance;
import org.apache.isis.core.metamodel.spec.ObjectInstantiator;
@@ -129,18 +132,15 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
protected final ObjectMemberContext objectMemberContext;
- private final List<ObjectAction> objectActions = Lists.newArrayList();
private final List<ObjectAssociation> associations = Lists.newArrayList();
+ private final List<ObjectAction> objectActions = Lists.newArrayList();
+
+ private boolean contributeeAssociationsAdded;
+ private boolean contributeeActionsAdded;
+
private final List<ObjectSpecification> interfaces = Lists.newArrayList();
private final SubclassList subclasses = new SubclassList();
- private List<ObjectAssociation> contributeeAssociations;
-
- /**
- * Lazily populated in {@link #getContributeeActions(ActionType)}.
- */
- private final Map<ActionType, List<ObjectAction>> contributeeActionsByType = Maps.newLinkedHashMap();
-
private final Class<?> correspondingClass;
private final String fullName;
private final String shortName;
@@ -332,20 +332,16 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
this.subclasses.addSubclass(subclass);
}
- /**
- * Intended to be called within {@link #introspectTypeHierarchyAndMembers()}
- */
- protected void updateAssociations(final List<ObjectAssociation> associations) {
+ protected void sortAndUpdateAssociations(final List<ObjectAssociation> associations) {
+ final List<ObjectAssociation> orderedAssociations = sortAssociations(associations);
this.associations.clear();
- this.associations.addAll(associations);
+ this.associations.addAll(orderedAssociations);
}
- /**
- * Intended to be called within {@link #introspectTypeHierarchyAndMembers()}
- */
- protected void updateObjectActions(final List<ObjectAction> objectActions) {
+ protected void sortAndUpdateActions(final List<ObjectAction> objectActions) {
+ final List<ObjectAction> orderedActions = sortActions(objectActions);
this.objectActions.clear();
- this.objectActions.addAll(objectActions);
+ this.objectActions.addAll(orderedActions);
}
// //////////////////////////////////////////////////////////////////////
@@ -653,10 +649,14 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
@Override
public List<ObjectAssociation> getAssociations(final Contributed contributee) {
- List<ObjectAssociation> associations = Lists.newArrayList(this.associations);
- if(contributee.isIncluded()) {
- associations.addAll(getContributeeAssociations());
+ if(contributee.isIncluded() && !contributeeAssociationsAdded) {
+ List<ObjectAssociation> associations = Lists.newArrayList(this.associations);
+ final List<ObjectAssociation> contributeeAssociations = createContributeeAssociations();
+ associations.addAll(contributeeAssociations);
+ sortAndUpdateAssociations(associations);
+ contributeeAssociationsAdded = true;
}
+ final List<ObjectAssociation> associations = Lists.newArrayList(this.associations);
return Lists.newArrayList(Iterables.filter(
associations, ContributeeMember.Predicates.regularElse(contributee)));
}
@@ -697,7 +697,7 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
public List<OneToOneAssociation> getProperties(Contributed contributed) {
- final List list = getAssociations(contributed, ObjectAssociationFilters.PROPERTIES);
+ final List list = getAssociations(contributed, ObjectAssociation.Filters.PROPERTIES);
return list;
}
@@ -714,6 +714,32 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
@Override
public List<ObjectAction> getObjectActions(
+ final List<ActionType> types,
+ final Contributed contributed,
+ final Filter<ObjectAction> filter) {
+ if(contributed.isIncluded() && !contributeeActionsAdded) {
+ final List<ObjectAction> actions = Lists.newArrayList(this.objectActions);
+ actions.addAll(createContributeeActions());
+ sortAndUpdateActions(actions);
+ contributeeActionsAdded = true;
+ }
+
+ final List<ObjectAction> actions = Lists.newArrayList();
+ for (final ActionType type : types) {
+ @SuppressWarnings("unchecked")
+ final List<ObjectAction> filterActions =
+ Lists.newArrayList(Iterables.filter(
+ objectActions,
+ Filters.asPredicate(Filters.and(
+ ObjectAction.Filters.ofType(type), filter))));
+ actions.addAll(filterActions);
+ }
+ return Lists.newArrayList(Iterables.filter(
+ actions, ContributeeMember.Predicates.regularElse(contributed)));
+ }
+
+ @Override
+ public List<ObjectAction> getObjectActions(
final Contributed contributed) {
return getObjectActions(ActionType.ALL, contributed, Filters.<ObjectAction>any());
}
@@ -726,34 +752,70 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
return getObjectActions(Collections.singletonList(type), contributed, filter);
}
- @Override
- public List<ObjectAction> getObjectActions(
- final List<ActionType> types,
- final Contributed contributed,
- final Filter<ObjectAction> filter) {
- final List<ObjectAction> actions = Lists.newArrayList();
- for (final ActionType type : types) {
- addActions(type, contributed, filter, actions);
+ // //////////////////////////////////////////////////////////////////////
+ // sorting
+ // //////////////////////////////////////////////////////////////////////
+
+ protected List<ObjectAssociation> sortAssociations(final List<ObjectAssociation> associations) {
+ final DeweyOrderSet orderSet = DeweyOrderSet.createOrderSet(associations);
+ final MemberGroupLayoutFacet memberGroupLayoutFacet = this.getFacet(MemberGroupLayoutFacet.class);
+
+ if(memberGroupLayoutFacet != null) {
+ final List<String> groupOrder = Lists.newArrayList();
+ groupOrder.addAll(memberGroupLayoutFacet.getLeft());
+ groupOrder.addAll(memberGroupLayoutFacet.getMiddle());
+ groupOrder.addAll(memberGroupLayoutFacet.getRight());
+
+ orderSet.reorderChildren(groupOrder);
+ }
+ final List<ObjectAssociation> orderedAssociations = Lists.newArrayList();
+ sortAssociations(orderSet, orderedAssociations);
+ return orderedAssociations;
+ }
+
+ private static void sortAssociations(final DeweyOrderSet orderSet, final List<ObjectAssociation> associationsToAppendTo) {
+ for (final Object element : orderSet) {
+ if (element instanceof OneToManyAssociation) {
+ associationsToAppendTo.add((ObjectAssociation) element);
+ } else if (element instanceof OneToOneAssociation) {
+ associationsToAppendTo.add((ObjectAssociation) element);
+ } else if (element instanceof DeweyOrderSet) {
+ // just flatten.
+ DeweyOrderSet childOrderSet = (DeweyOrderSet) element;
+ sortAssociations(childOrderSet, associationsToAppendTo);
+ } else {
+ throw new UnknownTypeException(element);
+ }
}
- return Lists.newArrayList(Iterables.filter(
- actions, ContributeeMember.Predicates.regularElse(contributed)));
}
- private List<ObjectAction> addActions(final ActionType type, final Contributed contributee, final Filter<ObjectAction> filter, final List<ObjectAction> actionListToAppendTo) {
- if(contributee.isIncluded()) {
- actionListToAppendTo.addAll(getContributeeActions(type, filter));
- }
- actionListToAppendTo.addAll(filterActions(objectActions, type, filter));
- return actionListToAppendTo;
+ protected static List<ObjectAction> sortActions(final List<ObjectAction> actions) {
+ final DeweyOrderSet orderSet = DeweyOrderSet.createOrderSet(actions);
+ final List<ObjectAction> orderedActions = Lists.newArrayList();
+ sortActions(orderSet, orderedActions);
+ return orderedActions;
}
- @SuppressWarnings("unchecked")
- private static List<ObjectAction> filterActions(final List<ObjectAction> objectActions, final ActionType type, final Filter<ObjectAction> filter) {
- return Lists.newArrayList(Iterables.filter(
- objectActions,
- Filters.asPredicate(Filters.and(ObjectAction.Filters.ofType(type), filter))));
+ private static void sortActions(final DeweyOrderSet orderSet, final List<ObjectAction> actionsToAppendTo) {
+ for (final Object element : orderSet) {
+ if(element instanceof ObjectAction) {
+ final ObjectAction objectAction = (ObjectAction) element;
+ actionsToAppendTo.add(objectAction);
+ }
+ else if (element instanceof DeweyOrderSet) {
+ final DeweyOrderSet set = ((DeweyOrderSet) element);
+ final List<ObjectAction> actions = Lists.newArrayList();
+ sortActions(set, actions);
+ actionsToAppendTo.addAll(actions);
+ } else {
+ throw new UnknownTypeException(element);
+ }
+ }
}
+ // //////////////////////////////////////////////////////////////////////
+ // getServiceActionsReturning
+ // //////////////////////////////////////////////////////////////////////
@Override
public List<ObjectAction> getServiceActionsReturning(final List<ActionType> types) {
@@ -803,16 +865,15 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
// contributee associations (properties and collections)
// //////////////////////////////////////////////////////////////////////
- private List<ObjectAssociation> getContributeeAssociations() {
+ private List<ObjectAssociation> createContributeeAssociations() {
if (isService()) {
return Collections.emptyList();
}
- if (contributeeAssociations == null) {
- contributeeAssociations = Lists.newArrayList();
- final List<ObjectAdapter> services = getServicesProvider().getServices();
- for (final ObjectAdapter serviceAdapter : services) {
- addContributeeAssociationsIfAny(serviceAdapter, contributeeAssociations);
- }
+
+ final List<ObjectAssociation> contributeeAssociations = Lists.newArrayList();
+ final List<ObjectAdapter> services = getServicesProvider().getServices();
+ for (final ObjectAdapter serviceAdapter : services) {
+ addContributeeAssociationsIfAny(serviceAdapter, contributeeAssociations);
}
return contributeeAssociations;
}
@@ -877,44 +938,34 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
// //////////////////////////////////////////////////////////////////////
/**
- * All contributee actions (each wrapping a service's contributed action) for this spec;
- * these are lazily created and then cached.
+ * All contributee actions (each wrapping a service's contributed action) for this spec.
*
* <p>
* If this specification {@link #isService() is actually for} a service,
* then returns an empty list.
*/
- protected List<ObjectAction> getContributeeActions(final ActionType actionType, Filter<ObjectAction> filter) {
+ protected List<ObjectAction> createContributeeActions() {
if (isService()) {
return Collections.emptyList();
}
- List<ObjectAction> contributedActionSets = getContributeeActions(actionType);
- return Lists.newArrayList(Iterables.filter(contributedActionSets, Filters.asPredicate(filter)));
- }
-
- private List<ObjectAction> getContributeeActions(final ActionType actionType) {
- List<ObjectAction> contributeeActions = contributeeActionsByType.get(actionType);
- if (contributeeActions == null) {
- contributeeActions = Lists.newArrayList();
- contributeeActionsByType.put(actionType, contributeeActions);
+ final List<ObjectAction> contributeeActions = Lists.newArrayList();
- // populate an ActionSet with all actions contributed by each
- // service
- final List<ObjectAdapter> services = getServicesProvider().getServices();
- for (final ObjectAdapter serviceAdapter : services) {
- addContributeeActionsIfAny(serviceAdapter, actionType, contributeeActions);
- }
+ final List<ObjectAdapter> services = getServicesProvider().getServices();
+ for (final ObjectAdapter serviceAdapter : services) {
+ addContributeeActionsIfAny(serviceAdapter, contributeeActions);
}
return contributeeActions;
}
- private void addContributeeActionsIfAny(final ObjectAdapter serviceAdapter, final ActionType actionType, final List<ObjectAction> contributeeActionsToAppendTo) {
+ private void addContributeeActionsIfAny(
+ final ObjectAdapter serviceAdapter,
+ final List<ObjectAction> contributeeActionsToAppendTo) {
final ObjectSpecification specification = serviceAdapter.getSpecification();
if (specification == this) {
return;
}
final List<ObjectAction> contributeeActions = Lists.newArrayList();
- final List<ObjectAction> serviceActions = specification.getObjectActions(actionType, Contributed.INCLUDED, Filters.<ObjectAction>any());
+ final List<ObjectAction> serviceActions = specification.getObjectActions(ActionType.ALL, Contributed.INCLUDED, Filters.<ObjectAction>any());
for (final ObjectAction serviceAction : serviceActions) {
if (serviceAction.isAlwaysHidden()) {
continue;
@@ -926,13 +977,14 @@ public abstract class ObjectSpecificationAbstract extends FacetHolderImpl implem
if(!(serviceAction instanceof ObjectActionImpl)) {
continue;
}
- ObjectActionImpl contributedAction = (ObjectActionImpl) serviceAction;
+ final ObjectActionImpl contributedAction = (ObjectActionImpl) serviceAction;
// see if qualifies by inspecting all parameters
final int contributeeParam = contributeeParameterMatchOf(contributedAction);
if (contributeeParam != -1) {
ObjectActionContributee contributeeAction =
new ObjectActionContributee(serviceAdapter, contributedAction, contributeeParam, this, objectMemberContext);
+
contributeeActions.add(contributeeAction);
}
}
http://git-wip-us.apache.org/repos/asf/isis/blob/242739ad/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
index bc2940b..496f2fc 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/dflt/ObjectSpecificationDefault.java
@@ -109,6 +109,11 @@ public class ObjectSpecificationDefault extends ObjectSpecificationAbstract impl
private FacetedMethodsBuilder facetedMethodsBuilder;
+ /**
+ * Only populated once {@link #introspectTypeHierarchyAndMembers()} is called.
+ */
+ private Properties metadataProperties;
+
// //////////////////////////////////////////////////////////////////////
// Constructor
// //////////////////////////////////////////////////////////////////////
@@ -126,10 +131,9 @@ public class ObjectSpecificationDefault extends ObjectSpecificationAbstract impl
@Override
public void introspectTypeHierarchyAndMembers() {
- // class
- Properties properties = null;
+ metadataProperties = null;
if(isNotIntrospected()) {
- properties = facetedMethodsBuilder.introspectClass();
+ metadataProperties = facetedMethodsBuilder.introspectClass();
}
// name
@@ -154,14 +158,15 @@ public class ObjectSpecificationDefault extends ObjectSpecificationAbstract impl
// walk superinterfaces
+ //
// REVIEW: the processing here isn't quite the same as with
- // superclasses,
- // in that with superclasses the superclass adds this type as its
- // subclass,
- // whereas here this type defines itself as the subtype.
+ // superclasses, in that with superclasses the superclass adds this type as its
+ // subclass, whereas here this type defines itself as the subtype.
+ //
// it'd be nice to push the responsibility for adding subclasses to
// the interface type... needs some tests around it, though, before
// making that refactoring.
+ //
final Class<?>[] interfaceTypes = getCorrespondingClass().getInterfaces();
final List<ObjectSpecification> interfaceSpecList = Lists.newArrayList();
for (final Class<?> interfaceType : interfaceTypes) {
@@ -181,19 +186,17 @@ public class ObjectSpecificationDefault extends ObjectSpecificationAbstract impl
// associations and actions
if(isNotIntrospected()) {
- final List<ObjectAssociation> associations = createAssociations(properties);
- final List<ObjectAssociation> orderedAssociations = sortAssociations(associations);
- updateAssociations(orderedAssociations);
+ final List<ObjectAssociation> associations = createAssociations(metadataProperties);
+ sortAndUpdateAssociations(associations);
}
if(isNotIntrospected()) {
- final List<ObjectAction> actions = createActions(properties);
- final List<ObjectAction> orderedActions = sortActions(actions);
- updateObjectActions(orderedActions);
+ final List<ObjectAction> actions = createActions(metadataProperties);
+ sortAndUpdateActions(actions);
}
if(isNotIntrospected()) {
- facetedMethodsBuilder.introspectClassPostProcessing(properties);
+ facetedMethodsBuilder.introspectClassPostProcessing(metadataProperties);
}
if(isNotIntrospected()) {
@@ -242,8 +245,8 @@ public class ObjectSpecificationDefault extends ObjectSpecificationAbstract impl
}
}
- private List<ObjectAction> createActions(Properties properties) {
- final List<FacetedMethod> actionFacetedMethods = facetedMethodsBuilder.getActionFacetedMethods(properties);
+ private List<ObjectAction> createActions(Properties metadataProperties) {
+ final List<FacetedMethod> actionFacetedMethods = facetedMethodsBuilder.getActionFacetedMethods(metadataProperties);
final List<ObjectAction> actions = Lists.newArrayList();
for (FacetedMethod facetedMethod : actionFacetedMethods) {
final ObjectAction action = createAction(facetedMethod);
@@ -263,66 +266,6 @@ public class ObjectSpecificationDefault extends ObjectSpecificationAbstract impl
}
}
- // //////////////////////////////////////////////////////////////////////
- // sorting
- // //////////////////////////////////////////////////////////////////////
-
- private List<ObjectAssociation> sortAssociations(final List<ObjectAssociation> associations) {
- final DeweyOrderSet orderSet = DeweyOrderSet.createOrderSet(associations);
- final MemberGroupLayoutFacet memberGroupLayoutFacet = this.getFacet(MemberGroupLayoutFacet.class);
-
- if(memberGroupLayoutFacet != null) {
- final List<String> groupOrder = Lists.newArrayList();
- groupOrder.addAll(memberGroupLayoutFacet.getLeft());
- groupOrder.addAll(memberGroupLayoutFacet.getMiddle());
- groupOrder.addAll(memberGroupLayoutFacet.getRight());
-
- orderSet.reorderChildren(groupOrder);
- }
- final List<ObjectAssociation> orderedAssociations = Lists.newArrayList();
- sortAssociations(orderSet, orderedAssociations);
- return orderedAssociations;
- }
-
- private List<ObjectAction> sortActions(final List<ObjectAction> actions) {
- final DeweyOrderSet orderSet = DeweyOrderSet.createOrderSet(actions);
- final List<ObjectAction> orderedActions = Lists.newArrayList();
- sortActions(orderSet, orderedActions);
- return orderedActions;
- }
-
- private void sortAssociations(final DeweyOrderSet orderSet, final List<ObjectAssociation> associationsToAppendTo) {
- for (final Object element : orderSet) {
- if (element instanceof OneToManyAssociation) {
- associationsToAppendTo.add((ObjectAssociation) element);
- } else if (element instanceof OneToOneAssociation) {
- associationsToAppendTo.add((ObjectAssociation) element);
- } else if (element instanceof DeweyOrderSet) {
- // just flatten.
- DeweyOrderSet childOrderSet = (DeweyOrderSet) element;
- sortAssociations(childOrderSet, associationsToAppendTo);
- } else {
- throw new UnknownTypeException(element);
- }
- }
- }
-
- private void sortActions(final DeweyOrderSet orderSet, final List<ObjectAction> actionsToAppendTo) {
- for (final Object element : orderSet) {
- if(element instanceof ObjectAction) {
- final ObjectAction objectAction = (ObjectAction) element;
- actionsToAppendTo.add(objectAction);
- }
- else if (element instanceof DeweyOrderSet) {
- final DeweyOrderSet set = ((DeweyOrderSet) element);
- final List<ObjectAction> actions = Lists.newArrayList();
- sortActions(set, actions);
- actionsToAppendTo.addAll(actions);
- } else {
- throw new UnknownTypeException(element);
- }
- }
- }
// //////////////////////////////////////////////////////////////////////
// Whether a service or not
@@ -380,7 +323,7 @@ public class ObjectSpecificationDefault extends ObjectSpecificationAbstract impl
}
// //////////////////////////////////////////////////////////////////////
- // Actions
+ // getObjectAction
// //////////////////////////////////////////////////////////////////////
@Override
http://git-wip-us.apache.org/repos/asf/isis/blob/242739ad/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/order/MemberOrderFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/order/MemberOrderFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/order/MemberOrderFacetFactory.java
index 334615a..52bafc3 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/order/MemberOrderFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/members/order/MemberOrderFacetFactory.java
@@ -41,7 +41,7 @@ public class MemberOrderFacetFactory extends FacetFactoryAbstract {
final FacetedMethod holder = processMethodContext.getFacetHolder();
MemberOrderFacet memberOrderFacet = null;
- final Properties properties = processMethodContext.layoutProperties("memberOrder");
+ final Properties properties = processMethodContext.metadataProperties("memberOrder");
if(properties != null) {
memberOrderFacet = new MemberOrderFacetProperties(properties, holder);
}
http://git-wip-us.apache.org/repos/asf/isis/blob/242739ad/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/membergroups/MemberGroupLayoutFacetFactory.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/membergroups/MemberGroupLayoutFacetFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/membergroups/MemberGroupLayoutFacetFactory.java
index 65fb362..e10f81a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/membergroups/MemberGroupLayoutFacetFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/progmodel/facets/object/membergroups/MemberGroupLayoutFacetFactory.java
@@ -60,7 +60,7 @@ public class MemberGroupLayoutFacetFactory extends FacetFactoryAbstract implemen
final Class<?> cls = processClassContext.getCls();
- final Properties properties = processClassContext.layoutProperties("memberGroupLayout");
+ final Properties properties = processClassContext.metadataProperties("memberGroupLayout");
if(properties != null) {
return new MemberGroupLayoutFacetProperties(properties, holder);
}