/*******************************************************************************
* This file is part of the Symfony eclipse plugin.
*
* (c) Robert Gruendler <r.gruendler@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
******************************************************************************/
package com.dubture.symfony.core.util;
import org.eclipse.core.runtime.IPath;
import org.eclipse.dltk.core.IField;
import org.eclipse.dltk.core.IMethod;
import org.eclipse.dltk.core.ISourceModule;
import org.eclipse.dltk.core.IType;
import org.eclipse.dltk.core.index2.search.ISearchEngine.MatchRule;
import org.eclipse.dltk.core.search.IDLTKSearchScope;
import org.eclipse.dltk.core.search.SearchEngine;
import org.eclipse.php.core.compiler.ast.nodes.Scalar;
import org.eclipse.php.internal.core.model.PHPModelAccess;
import org.eclipse.wst.sse.core.utils.StringUtils;
import com.dubture.symfony.core.model.SymfonyModelAccess;
import com.dubture.symfony.core.preferences.SymfonyCoreConstants;
/**
*
*
*
*
*
* @author Robert Gruendler <r.gruendler@gmail.com>
*
*/
@SuppressWarnings("restriction")
public class PathUtils {
/**
*
* Return the name of the Controller for a given ViewPath
*
* @param path
* @return
*/
public static String getControllerFromTemplatePath(IPath path) {
int size = path.segmentCount();
for (int i=0; i < size; i++) {
if (path.segment(i).equals("views") && (i+1 < size)) {
return path.segment(i+1) + "Controller";
}
}
return null;
}
/**
* Extract the Viewname from a given template path.
*
* Returns null if it's not a valid template path.
*
* @param path
* @return
*/
public static String getViewFromTemplatePath(IPath path) {
String fileName = path.lastSegment();
if (fileName.indexOf(".") > -1)
return fileName.substring(0, fileName.indexOf('.'));
return null;
}
/**
*
* Checks if the field is declared in a controller matching
* the template module.
*
* @param field
* @param module
* @return
*/
public static boolean isTemplateVariable(IField field, ISourceModule module) {
ISourceModule fieldModule = field.getSourceModule();
IPath fieldPath = fieldModule.getPath();
String controller = getControllerFromFieldPath(fieldPath);
String viewName = getViewFromTemplatePath(module.getPath());
if (controller == null || viewName == null)
return false;
IDLTKSearchScope scope = SearchEngine.createSearchScope(field.getSourceModule());
IMethod[] methods = PHPModelAccess.getDefault().findMethods(null, MatchRule.PREFIX, 0, 0, scope, null);
for (IMethod method : methods) {
if (method.getElementName().startsWith(viewName))
return true;
}
return false;
}
/**
* Get the Controller name from a given Path. Returns
* null if it's not a controller path.
*
* @param path
* @return
*/
public static String getControllerFromFieldPath(IPath path) {
if (path.segment(path.segmentCount()-2).equals(SymfonyCoreConstants.CONTROLLER_CLASS)
&& path.getFileExtension().equals("php")) {
return path.lastSegment().replace(".php", "");
}
return null;
}
/**
* Very simple check, this needs to be refined...
*
* @param path
* @return
*/
public static boolean isViewPath(String path) {
return StringUtils.occurrencesOf(path, ':') == 2;
}
public static String createViewPathFromTemplate(ISourceModule sourceModule, boolean keepFileExtension) {
SymfonyModelAccess model = SymfonyModelAccess.getDefault();
String viewName = sourceModule.getPath().lastSegment();
if (keepFileExtension == false)
viewName = PathUtils.getViewFromTemplatePath(sourceModule.getPath());
IType controller = model.findControllerByTemplate(sourceModule);
if (controller == null)
return null;
String bundle = ModelUtils.extractBundleName(controller.getFullyQualifiedName());
if (bundle == null)
return null;
String controllerPart = controller.getElementName().replace(SymfonyCoreConstants.CONTROLLER_CLASS, "");
return String.format("%s:%s:%s", bundle, controllerPart, viewName);
}
/**
*
* Creates a valid ViewPath from a {@link Scalar} stripping
* away any file extensions and quotes:
*
* <pre>
* 'AcmeBlogBundle:Blog:show.html.twig' => AcmeBlogBundle:Blog:show
* </pre>
*
* @param view The scalar representing the view part
*
* @return The view path without the extension portion
*/
public static String createViewPath(Scalar view) {
return createViewPath(view.getValue());
}
public static String createViewPath(String viewString) {
String path = viewString.replaceAll("['\"]", "");
int dotIndex = path.indexOf('.');
if (dotIndex == -1) {
return path;
}
return path.substring(0, dotIndex);
}
}