use of com.intellij.struts2.dom.struts.action.Action in project intellij-plugins by JetBrains.
the class JspActionAnnotator method annotate.
private static void annotate(@NotNull final PsiElement element, @NotNull final Collection<LineMarkerInfo> lineMarkerInfos) {
if (!(element instanceof XmlTag)) {
return;
}
final XmlTag xmlTag = (XmlTag) element;
// any of our tags?
final String tagName = xmlTag.getLocalName();
if (Arrays.binarySearch(TAGS_WITH_ACTION_ATTRIBUTE, tagName) < 0) {
return;
}
if (!Comparing.equal(xmlTag.getNamespace(), StrutsConstants.TAGLIB_STRUTS_UI_URI)) {
return;
}
// short exit when Struts 2 facet not present
final Module module = ModuleUtilCore.findModuleForPsiElement(element);
if (module == null) {
return;
}
if (StrutsFacet.getInstance(module) == null) {
return;
}
// special case for <action>
final String actionPath = Comparing.equal(tagName, ACTION_ATTRIBUTE_NAME) ? xmlTag.getAttributeValue("name") : xmlTag.getAttributeValue(ACTION_ATTRIBUTE_NAME);
if (actionPath == null) {
return;
}
final StrutsModel strutsModel = StrutsManager.getInstance(element.getProject()).getCombinedModel(module);
if (strutsModel == null) {
return;
}
final String namespace = xmlTag.getAttributeValue("namespace");
final List<Action> actions = strutsModel.findActionsByName(actionPath, namespace);
if (actions.isEmpty()) {
return;
}
// resolve to action method should be exactly 1
final NavigationGutterIconBuilder<PsiElement> gutterIconBuilder = NavigationGutterIconBuilder.create(StrutsIcons.ACTION_CLASS).setAlignment(GutterIconRenderer.Alignment.LEFT).setTooltipText(StrutsBundle.message("annotators.jsp.goto.action.method")).setEmptyPopupText(StrutsBundle.message("annotators.jsp.goto.action.method.not.found")).setTargets(new NotNullLazyValue<Collection<? extends PsiElement>>() {
@NotNull
protected Collection<PsiMethod> compute() {
return ContainerUtil.mapNotNull(actions, ACTION_METHOD_FUNCTION);
}
});
lineMarkerInfos.add(gutterIconBuilder.createLineMarkerInfo(xmlTag));
}
use of com.intellij.struts2.dom.struts.action.Action in project intellij-plugins by JetBrains.
the class ResultActionPropertyReferenceProvider method getReferencesByElement.
@NotNull
@Override
public PsiReference[] getReferencesByElement(@NotNull final PsiElement psiElement, @NotNull final ProcessingContext processingContext) {
final Result result = (Result) DomUtil.getDomElement(psiElement);
assert result != null : psiElement.getText();
final Action action = result.getParentOfType(Action.class, true);
assert action != null : psiElement.getText();
final PsiClass actionClass = action.searchActionClass();
if (actionClass == null) {
return PsiReference.EMPTY_ARRAY;
}
final int tagValueStartOffset = ElementManipulators.getOffsetInElement(result.getXmlTag());
PsiReference[] references = new PsiReference[1];
final String stringValue = result.getStringValue();
if (!StringUtil.isNotEmpty(stringValue)) {
return PsiReference.EMPTY_ARRAY;
}
final String resultText = StringUtil.replace(stringValue, "&", "&");
final int lastExpressionEnd = // missing '}'
Math.max(// missing '}'
resultText.length(), resultText.lastIndexOf(EXPRESSION_START));
int startOffset = 0;
while (startOffset < lastExpressionEnd) {
startOffset = resultText.indexOf(EXPRESSION_START, startOffset);
if (startOffset == -1) {
break;
}
startOffset += EXPRESSION_START.length();
final int closingBraceIdx = resultText.indexOf(EXPRESSION_END, startOffset);
final int length = (closingBraceIdx != -1 ? closingBraceIdx : resultText.length()) - startOffset;
final String expressionString = resultText.substring(startOffset, startOffset + length);
// we only "fake" OGNL here, skip method call expressions for now
if (StringUtil.containsChar(expressionString, '(')) {
continue;
}
final BeanPropertyPathReferenceSet propertyPathReferenceSet = new BeanPropertyPathReferenceSet(expressionString, psiElement, startOffset, '.', actionClass, true) {
// CTOR creates references eagerly, so we have to subclass here
@Override
public boolean isSoft() {
return false;
}
@NotNull
@Override
protected BeanPropertyPathReference createReference(final TextRange range, final int index) {
final TextRange shift = TextRange.from(range.getStartOffset() + tagValueStartOffset, // shift range to XmlTag value range
range.getLength());
return createBeanPropertyPathReference(shift, index);
}
};
references = ArrayUtil.mergeArrays(references, propertyPathReferenceSet.getPsiReferences());
}
return references;
}
use of com.intellij.struts2.dom.struts.action.Action in project intellij-plugins by JetBrains.
the class StrutsUITaglibReferenceContributor method registerReferenceProviders.
@Override
public void registerReferenceProviders(@NotNull final PsiReferenceRegistrar registrar) {
// common attributes --------------------------------------
registerTags(new ThemeReferenceProvider(), "theme", registrar, TAGLIB_UI_FORM_TAGS);
registerBoolean("disabled", registrar, TAGLIB_UI_FORM_TAGS);
registerTags(new StaticStringValuesReferenceProvider(false, "left", "top"), "labelposition", registrar, TAGLIB_UI_FORM_TAGS);
registerTags(ACTION_PROPERTY_REFERENCE_PROVIDER, "name", registrar, TAGLIB_UI_FORM_INPUT_TAGS);
registerTags(ACTION_PROPERTY_REFERENCE_PROVIDER, "list", registrar, "doubleselect", "inputtransferselect", "optiontransferselect", "select", "updownselect");
registerBoolean("required", registrar, TAGLIB_UI_FORM_TAGS);
registerTags(ID_REFERENCE_PROVIDER, "id", registrar, TAGLIB_UI_FORM_INPUT_TAGS);
registerTags(new StaticStringValuesReferenceProvider(false, "left", "right"), "requiredposition", registrar, TAGLIB_UI_FORM_TAGS);
registerTags(wrappedPropertiesProvider, "key", registrar, TAGLIB_UI_FORM_INPUT_TAGS);
// elements with "readonly"
registerBoolean("readonly", registrar, "combobox", "password", "textarea", "textfield");
// selection elements with "emptyOption"|"multiple"
registerBoolean("emptyOption", registrar, "doubleselect", "inputtransferselect", "optiontransferselect", "select", "updownselect");
registerBoolean("multiple", registrar, "doubleselect", "inputtransferselect", "optiontransferselect", "select", "updownselect");
// elements with "action"
registerTags(ACTION_REFERENCE_PROVIDER, "action", registrar, "a", "form", "reset", "submit", "url");
registerTags(ACTION_REFERENCE_PROVIDER, "name", registrar, "action");
registerTags(new ActionMethodReferenceProvider(), "method", registrar, "a", "reset", "submit", "url");
// elements with "value" (relative path)
registerTags(RELATIVE_PATH_PROVIDER, "value", registrar, "include", "url");
// elements with "namespace"
registerTags(new NamespaceReferenceProvider(), "namespace", registrar, "a", "action", "form", "url");
// CSS classes
registerTags(CSS_CLASS_PROVIDER, "cssClass", registrar, TAGLIB_UI_FORM_TAGS);
registerTags(CSS_CLASS_PROVIDER, "cssErrorClass", registrar, TAGLIB_UI_FORM_TAGS);
registerTags(CSS_CLASS_PROVIDER, "tooltipCssClass", registrar, TAGLIB_UI_FORM_TAGS);
// *transfer/double-tags
registerTags(CSS_CLASS_PROVIDER, "buttonCssClass", registrar, "inputtransferselect", "optiontransferselect");
registerTags(CSS_CLASS_PROVIDER, "doubleCssClass", registrar, "inputtransferselect", "optiontransferselect");
registerBoolean("doubleEmptyOption", registrar, "doubleselect", "inputtransferselect", "optiontransferselect");
registerTags(ACTION_PROPERTY_REFERENCE_PROVIDER, "doubleName", registrar, "doubleselect", "optiontransferselect");
registerTags(ACTION_PROPERTY_REFERENCE_PROVIDER, "doubleList", registrar, "doubleselect", "optiontransferselect");
// specific tags ---------------------------------------------------------------------------------------------------
// <action>
registerBoolean("flush", registrar, "action");
registerBoolean("executeResult", registrar, "action");
registerBoolean("ignoreContextParams", registrar, "action");
// <date>
registerBoolean("nice", registrar, "date");
// <form>
registerTags(new StaticStringValuesReferenceProvider(false, "application/x-www-form-urlencoded", "multipart/form-data"), "enctype", registrar, "form");
registerTags(new StaticStringValuesReferenceProvider("GET", "POST"), "method", registrar, "form");
registerTags(new StaticStringValuesReferenceProvider("_blank", "_parent", "_self", "_top"), "target", registrar, "form");
registerBoolean("validate", registrar, "form");
// <param>
registerTags(ACTION_PROPERTY_REFERENCE_PROVIDER, "name", registrar, "param");
// <property>
registerBoolean("escape", registrar, "property");
registerBoolean("escapeJavaScript", registrar, "property");
// <set>
registerTags(new StaticStringValuesReferenceProvider(false, "application", "session", "request", "page", "action"), "scope", registrar, "set");
// <submit>
registerTags(new StaticStringValuesReferenceProvider(false, "input", "button", "image", "submit"), "type", registrar, "submit");
registerTags(RELATIVE_PATH_PROVIDER, "src", registrar, "submit");
// <text>
registerTags(wrappedPropertiesProvider, "name", registrar, "text");
registerBoolean("searchValueStack", registrar, "text");
// <url>
registerBoolean("encode", registrar, "url");
registerBoolean("escapeAmp", registrar, "url");
registerBoolean("forceAddSchemeHostAndPort", registrar, "url");
registerBoolean("includeContext", registrar, "url");
registerTags(new StaticStringValuesReferenceProvider(false, "none", "get", "all"), "includeParams", registrar, "url");
}
use of com.intellij.struts2.dom.struts.action.Action in project intellij-plugins by JetBrains.
the class Struts2ModelInspection method shouldCheckResolveProblems.
protected boolean shouldCheckResolveProblems(final GenericDomValue value) {
final Converter converter = value.getConverter();
// we roll our own checking for "class" in Struts2ModelInspectionVisitor
if (converter instanceof ExtendableClassConverter) {
return false;
}
// hack for STRPL-85: suppress <param>-highlighting within <result> for certain result-types
if (converter instanceof ParamNameConverter) {
final Result result = DomUtil.getParentOfType(value, Result.class, false);
if (result != null) {
final ResultType resultType = result.getEffectiveResultType();
if (resultType == null) {
// error
return false;
}
final String resultTypeValue = resultType.getName().getStringValue();
if (resultTypeValue != null && ResultTypeResolver.isChainOrRedirectType(resultTypeValue)) {
return false;
}
}
}
final String stringValue = value.getStringValue();
// suppress <action> "method" when using wildcards
if (converter instanceof ActionMethodConverter && ConverterUtil.hasWildcardReference(stringValue)) {
return false;
}
// suppress <result> path
if (converter instanceof StrutsPathReferenceConverter) {
if (stringValue == null) {
return false;
}
// nested <param>-tags are present
if (!((ParamsElement) value).getParams().isEmpty()) {
return false;
}
// unsupported result-type
final ResultType resultType = ((HasResultType) value).getEffectiveResultType();
if (resultType == null) {
return false;
}
if (!ResultTypeResolver.hasResultTypeContributor(resultType.getName().getStringValue())) {
return false;
}
// suppress paths with wildcard reference
if (ConverterUtil.hasWildcardReference(stringValue)) {
final Action action = DomUtil.getParentOfType(value, Action.class, true);
return action != null && !action.isWildcardMapping();
}
// "${actionProperty}"
if (StringUtil.startsWith(stringValue, "${")) {
return false;
}
// global URLs
if (URLUtil.containsScheme(stringValue)) {
return false;
}
}
return true;
}
use of com.intellij.struts2.dom.struts.action.Action in project intellij-plugins by JetBrains.
the class ResultParamNameCustomConverter method getCustomReferences.
@NotNull
@Override
public PsiReference[] getCustomReferences(XmlAttributeValue nameAttributeValue, DomElement paramsElement) {
if (!(paramsElement instanceof Result)) {
return PsiReference.EMPTY_ARRAY;
}
Result result = (Result) paramsElement;
Action action = DomUtil.getParentOfType(result, Action.class, true);
assert action != null;
return new PsiReference[] { new MergingBeanPropertyPathReference(nameAttributeValue, action, result) };
}
Aggregations