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.metamodel.facets;
021
022import java.util.List;
023import java.util.Properties;
024
025import com.google.common.collect.Lists;
026
027import org.apache.isis.applib.Identifier;
028import org.apache.isis.core.commons.lang.PropertiesExtensions;
029import org.apache.isis.core.metamodel.facets.members.order.MemberOrderFacet;
030import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
031import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
032import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
033import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
034import org.apache.isis.core.metamodel.specloader.specimpl.ContributeeMember;
035
036/**
037 * A {@link FacetFactory} which is applied to only for {@link ContributeeMember}s.
038 */
039public interface ContributeeMemberFacetFactory extends FacetFactory {
040
041    public static class ProcessContributeeMemberContext extends AbstractProcessContext<ObjectMember> 
042            implements ProcessContextWithMetadataProperties<ObjectMember> {
043        
044        private final Properties metadataProperties;
045
046        public ProcessContributeeMemberContext(
047                final Properties metadataProperties, 
048                final ObjectMember facetHolder) {
049            super(facetHolder);
050            this.metadataProperties = metadataProperties;
051        }
052
053        public Properties metadataProperties(String subKey) {
054            
055            if(metadataProperties == null) {
056                return null;
057            }
058            Identifier identifier = getFacetHolder().getIdentifier();
059            final String id = identifier.getMemberName();
060            
061            // build list of keys to search for... 
062            final List<String> keys = Lists.newArrayList();
063            if(getFacetHolder() instanceof ObjectAction) {
064                // ... either "action.actionId" or "member.actionId()" 
065                keys.add("action." + id+"."+subKey);
066                keys.add("member." + id+"()"+"."+subKey);
067            } else if(getFacetHolder() instanceof OneToOneAssociation) {
068                // ... either "property.propertyId" or "member.propertyId"  
069                keys.add("property." + id+"."+subKey);
070                keys.add("member." + id+"."+subKey);
071            } else if(getFacetHolder() instanceof OneToManyAssociation) {
072                // ... either "collection.collectionId" or "member.collectionId" 
073                keys.add("member." + id+"."+subKey);
074                keys.add("collection." + id+"."+subKey);
075            }
076
077            for (final String key : keys) {
078                final Properties subsetProperties = PropertiesExtensions.subset(this.metadataProperties, key);
079                if (!subsetProperties.isEmpty()) {
080                    return subsetProperties;
081                } 
082            }
083            
084            return null;
085        }
086    }
087    
088    /**
089     * Sort the member, and return the correctly setup annotation if present.
090     */
091    void process(ProcessContributeeMemberContext processMemberContext);
092
093}