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; 021 022import java.util.Arrays; 023import java.util.Collections; 024import java.util.List; 025 026import org.apache.isis.core.commons.config.IsisConfiguration; 027import org.apache.isis.core.metamodel.facetapi.FeatureType; 028import org.apache.isis.core.metamodel.facets.FacetFactoryAbstract; 029import org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactory; 030import org.apache.isis.core.metamodel.spec.ObjectSpecification; 031import org.apache.isis.core.metamodel.spec.feature.Contributed; 032import org.apache.isis.core.metamodel.spec.feature.ObjectAction; 033import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorComposite; 034import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorVisiting; 035import org.apache.isis.core.metamodel.specloader.validator.ValidationFailures; 036 037public abstract class MethodPrefixBasedFacetFactoryAbstract extends FacetFactoryAbstract implements MethodPrefixBasedFacetFactory { 038 039 private final List<String> prefixes; 040 041 protected static final Object[] NO_PARAMETERS = new Object[0]; 042 protected static final Class<?>[] NO_PARAMETERS_TYPES = new Class<?>[0]; 043 044 private final OrphanValidation orphanValidation; 045 046 protected enum OrphanValidation { 047 VALIDATE, 048 DONT_VALIDATE 049 } 050 051 public MethodPrefixBasedFacetFactoryAbstract(final List<FeatureType> featureTypes, OrphanValidation orphanValidation, final String... prefixes) { 052 super(featureTypes); 053 this.orphanValidation = orphanValidation; 054 this.prefixes = Collections.unmodifiableList(Arrays.asList(prefixes)); 055 } 056 057 @Override 058 public List<String> getPrefixes() { 059 return prefixes; 060 } 061 062 @Override 063 public void refineMetaModelValidator(MetaModelValidatorComposite metaModelValidator, IsisConfiguration configuration) { 064 if(orphanValidation == OrphanValidation.DONT_VALIDATE) { 065 return; 066 } 067 metaModelValidator.add(new MetaModelValidatorVisiting(new MetaModelValidatorVisiting.Visitor() { 068 069 @Override 070 public boolean visit(ObjectSpecification objectSpec, ValidationFailures validationFailures) { 071 List<ObjectAction> objectActions = objectSpec.getObjectActions(Contributed.EXCLUDED); 072 for (ObjectAction objectAction : objectActions) { 073 for (String prefix : prefixes) { 074 final String actionId = objectAction.getId(); 075 if (actionId.startsWith(prefix) && prefix.length() < actionId.length()) { 076 validationFailures.add("%s#%s has prefix %s, has probably been orphaned. If not an orphan, then rename and use @Named annotation", objectSpec.getIdentifier().getClassName(), actionId, prefix); 077 } 078 } 079 } 080 return true; 081 } 082 })); 083 } 084}