/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.isis.core.metamodel.facetapi; import org.apache.isis.core.metamodel.facets.actions.action.invocation.ActionInvocationFacet; public interface Facet { /** * The {@link FacetHolder holder} of this facet. * * @return */ FacetHolder getFacetHolder(); /** * Allows reparenting of Facet. * * <p> * Used by Facet decorators. * * @param facetHolder */ public void setFacetHolder(FacetHolder facetHolder); /** * Underlying {@link Facet} of the same {@link #facetType() type}, if any. */ public Facet getUnderlyingFacet(); /** * Sets underlying {@link Facet}, that is, creating a chain. * * <p> * Must be of the same {@link #facetType() type}. */ public void setUnderlyingFacet(Facet underlyingFacet); /** * Determines the type of this facet to be stored under. * * <p> * The framework looks for {@link Facet}s of certain well-known facet types. * Each facet implementation must specify which type of facet it corresponds * to. This therefore allows the (rules of the) programming model to be * varied without impacting the rest of the framework. * * <p> * For example, the <tt>ActionInvocationFacet</tt> specifies the facet to * invoke an action. The typical implementation of this wraps a * <tt>public</tt> method. However, a different facet factory could be * installed that creates facet also of type {@link ActionInvocationFacet} * but that have some other rule, such as requiring an <i>action</i> prefix, * or that decorate the interaction by logging it, for example. */ Class<? extends Facet> facetType(); /** * Whether this facet implementation is derived (as opposed to explicit); * used to determine precedence. * * <p> * For example, we might derive the typical length of a property based on * its type; but if the typical length has been explicitly specified using * an annotation then that should take precedence. */ public boolean isDerived(); /** * Whether this facet implementation is a no-op. */ public boolean isNoop(); /** * Whether this facet implementation should replace existing (none-noop) * implementations. */ public boolean alwaysReplace(); }