001/*
002 * (C) Copyright 2018 Nuxeo (http://nuxeo.com/) and others.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 *
016 * Contributors:
017 *     pierre
018 */
019package org.nuxeo.runtime.model;
020
021/**
022 * Descriptors implementing this interface will automatically be registered within the default registry in
023 * {@code DefaultComponent}.
024 *
025 * @since 10.3
026 */
027public interface Descriptor {
028
029    public static final String UNIQUE_DESCRIPTOR_ID = "";
030
031    /**
032     * The descriptor id, descriptors with same id are merged.
033     * <p>
034     * To forbid multiple descriptors use UNIQUE_DESCRIPTOR_ID.
035     * <p>
036     * To forbid merge use a unique value, non-overriden {@code toString()} for exemple.
037     */
038    String getId();
039
040    /**
041     * Returns a descriptor representing {@code other} merged into {@code this}
042     * <p>
043     * Default implementation returns {@code other}.
044     *
045     * @return the merged descriptor
046     */
047    default Descriptor merge(Descriptor other) {
048        return other;
049    }
050
051    /**
052     * During merge if a descriptor whose doesRemove() returns true is encountered, the merge chain is reset and started
053     * again on next descriptor.
054     * <p>
055     * If the last descriptor of same id doesRemove() return true, the descriptor for this id will be {@code null}.
056     */
057    default boolean doesRemove() {
058        return false;
059    }
060
061}