/*
* Copyright 2008-2017 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 griffon.core.mvc;
import griffon.core.Context;
import griffon.core.artifact.GriffonController;
import griffon.core.artifact.GriffonModel;
import griffon.core.artifact.GriffonView;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.Map;
/**
* Defines an MVC group and its contents
*
* @author Andres Almiray
* @since 2.0.0
*/
public interface MVCGroup extends MVCHandler {
/**
* Returns the configuration of this group.
*
* @return the configuration used to instantiate this group.
*/
@Nonnull
MVCGroupConfiguration getConfiguration();
/**
* Returns the type of this group as set in the application's configuration.
*
* @return the type of the group
*/
@Nonnull
String getMvcType();
/**
* Returns the id of the group.
* Ids are used to uniquely identify a group instance.
*
* @return the id of this group.
*/
@Nonnull
String getMvcId();
/**
* Returns the Model portion of this group.
*
* @return a GriffonModel instance if the group has a model member, null otherwise
* @throws IllegalStateException if the group has been destroyed already
*/
@Nullable
GriffonModel getModel();
/**
* Returns the View portion of this group.
*
* @return a GriffonView instance if the group has a view member, null otherwise
* @throws IllegalStateException if the group has been destroyed already
*/
@Nullable
GriffonView getView();
/**
* Returns the Controller portion of this group.
*
* @return a GriffonController instance if the group has a controller member, null otherwise
* @throws IllegalStateException if the group has been destroyed already
*/
@Nullable
GriffonController getController();
/**
* Returns the specified member type.
*
* @param name the type of member to retrieve
* @return the selected MVC member if a match is found, null otherwise
* @throws IllegalStateException if the group has been destroyed already
*/
@Nullable
Object getMember(@Nonnull String name);
/**
* Returns a read-only view of all instance members.
*
* @return an unmodifiable Map view of all members.
* @throws IllegalStateException if the group has been destroyed already
*/
@Nonnull
Map<String, Object> getMembers();
/**
* Destroys the current group.
* <strong>Should only be called once.</strong>
*
* @throws IllegalStateException if the group has been destroyed already
*/
void destroy();
/**
* Returns whether this group has been destroyed or not.
*
* @return true if the group has not been destroyed yet, false otherwise
*/
boolean isAlive();
/**
* Returns the context belonging to this group.
*
* @since 2.2.0
*/
@Nonnull
Context getContext();
/**
* Returns the parent {@code MVCGroup} of this group.
* <p>The parent may be null if this is a top level MVC group.</p>
*
* @since 2.2.0
*/
@Nullable
MVCGroup getParentGroup();
/**
* Returns an immutable view of all children groups for which this group is a parent
*
* @return an immutable view of children groups, keyed by mvcId.
* @since 2.4.0
*/
@Nonnull
Map<String, MVCGroup> getChildrenGroups();
/**
* Notifies the group when another MVC group has been destroyed, potentially
* a child group.
*
* @param mvcId the id of the group that has been destroyed
* @since 2.4.0
*/
void notifyMVCGroupDestroyed(@Nonnull String mvcId);
}