/* * Copyright 2013 the original author or authors. * * Licensed 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.gradle.model.internal.core; import com.google.common.base.Optional; import org.gradle.api.Nullable; import org.gradle.model.internal.core.rule.describe.ModelRuleDescriptor; import org.gradle.model.internal.type.ModelType; import java.util.List; import java.util.Set; public interface ModelNode { boolean hasLink(String name); boolean hasLink(String name, ModelType<?> type); // Note: order is crucial here. Nodes are traversed through these states in the order defined below enum State { Registered(true), // Initial state. Only path and some projections are known here Discovered(true), // All projections are defined Created(true), // Private data has been created, initial rules discovered DefaultsApplied(true), // Default values have been applied Initialized(true), Mutated(true), Finalized(false), SelfClosed(false), GraphClosed(false); public final boolean mutable; State(boolean mutable) { this.mutable = mutable; } public State previous() { return ModelNode.State.values()[ordinal() - 1]; } public boolean isAtLeast(State state) { return this.ordinal() >= state.ordinal(); } } ModelPath getPath(); ModelRuleDescriptor getDescriptor(); State getState(); /** * Creates an immutable view over this node's value. * * Callers should try to {@link ModelView#close()} the returned view when it is done with, allowing any internal cleanup to occur. * * Throws if this node can't be expressed as an immutable view of the requested type. */ <T> ModelView<? extends T> asImmutable(ModelType<T> type, @Nullable ModelRuleDescriptor ruleDescriptor); Set<String> getLinkNames(ModelType<?> type); Iterable<? extends ModelNode> getLinks(ModelType<?> type); /** * Should this node be hidden from the model report. */ boolean isHidden(); /** * The number of link this node has. */ int getLinkCount(); /** * Gets the value represented by this node. * * Calling this method may create or transition the node. */ Optional<String> getValueDescription(); /** * Gets the underlying type of this node. * <p> * Calling this method may create or transition the node. * <p> * In practice, this describes the type that you would get if you asked for this node as Object, read only. * This is used in the model report. * In the future we may need a more sophisticated (e.g. multi-type aware, visibility aware) mechanism for advertising the type. * <p> * If an absent is returned, this node can not be viewed as an object. */ Optional<String> getTypeDescription(); /** * Gets the rules that have been executed on this node in the order in which they were executed. */ List<ModelRuleDescriptor> getExecutedRules(); }