package net.bitpot.railways.models;
import com.intellij.navigation.ItemPresentation;
import com.intellij.navigation.NavigationItem;
import com.intellij.openapi.module.Module;
import net.bitpot.railways.gui.RailwaysIcons;
import net.bitpot.railways.models.requestMethods.RequestMethod;
import net.bitpot.railways.parser.route.RouteActionParser;
import net.bitpot.railways.parser.route.RoutePathParser;
import net.bitpot.railways.parser.route.TextChunk;
import net.bitpot.railways.utils.RailwaysUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.ruby.rails.model.RailsApp;
import javax.swing.*;
import java.util.List;
/**
* Route class stores all information about parsed route.
*/
public class Route implements NavigationItem {
private Module module = null;
private RequestMethod requestMethod = RequestMethod.ANY;
private String path = "";
private String routeName = "";
@Nullable
private RailsEngine myParentEngine = null;
// Cached path and action text chunks.
private List<TextChunk> pathChunks = null;
private List<TextChunk> actionChunks = null;
public Route(@Nullable Module module, RequestMethod requestMethod, String path,
String name) {
this.module = module;
this.requestMethod = requestMethod;
this.path = path;
this.routeName = name;
}
/**
* Returns module the route belongs to.
* @return Route module
*/
public Module getModule() {
return module;
}
@NotNull
public RequestMethod getRequestMethod() {
return requestMethod;
}
/**
* Returns displayable text for route action in short format. Short format
* is used in routes table.
*
* @return Displayable text for route action, ex. "users#create"
*/
public String getActionTitle() {
return getQualifiedActionTitle();
}
/**
* Returns qualified name for route action.
*
* @return Displayable text for route action, ex. "UsersController#create"
*/
public String getQualifiedActionTitle() {
return "";
}
/**
* Returns displayable name for navigation list.
*
* @return Display name of current route.
*/
@Nullable
@Override
public String getName() {
return path;
}
@Nullable
@Override
public ItemPresentation getPresentation() {
final Route route = this;
return new ItemPresentation() {
@Nullable
@Override
public String getPresentableText() {
return path;
}
@Nullable
@Override
public String getLocationString() {
return getActionTitle();
}
@Nullable
@Override
public Icon getIcon(boolean unused) {
return route.getRequestMethod().getIcon();
}
};
}
@Override
public void navigate(boolean requestFocus) {
// This method should be overridden in subclasses that support navigation.
}
@Override
public boolean canNavigate() {
return false;
}
@Override
public boolean canNavigateToSource() {
return canNavigate();
}
public String getPath() {
return path;
}
public String getPathWithMethod() {
String path = RailwaysUtils.stripRequestFormat(getPath());
if (getRequestMethod() == RequestMethod.ANY)
return path;
return String.format("%s %s", getRequestMethod().getName(), path);
}
public List<TextChunk> getPathChunks() {
if (pathChunks == null)
pathChunks = RoutePathParser.getInstance().parse(getPath());
return pathChunks;
}
public List<TextChunk> getActionChunks() {
if (actionChunks == null)
actionChunks = RouteActionParser.getInstance().parse(getActionTitle());
return actionChunks;
}
public String getRouteName() {
if (getParentEngine() != null)
return getParentEngine().getNamespace() + "." + routeName;
return routeName;
}
/**
* Checks route action status and sets isActionDeclarationFound flag.
*
* @param app Rails application which will be checked for controller action.
*/
public void updateActionStatus(RailsApp app) {
// Should be overridden in subclasses if an update is required.
}
@Nullable
public RailsEngine getParentEngine() {
return myParentEngine;
}
public void setParentEngine(RailsEngine parentEngine) {
myParentEngine = parentEngine;
}
public Icon getActionIcon() {
return RailwaysIcons.NODE_UNKNOWN;
}
}