Search in sources :

Example 1 with Action

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));
}
Also used : Action(com.intellij.struts2.dom.struts.action.Action) StrutsModel(com.intellij.struts2.dom.struts.model.StrutsModel) Collection(java.util.Collection) Module(com.intellij.openapi.module.Module) NotNull(org.jetbrains.annotations.NotNull) PsiElement(com.intellij.psi.PsiElement) XmlTag(com.intellij.psi.xml.XmlTag)

Example 2 with Action

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, "&", "&amp;");
    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;
}
Also used : Action(com.intellij.struts2.dom.struts.action.Action) TextRange(com.intellij.openapi.util.TextRange) BeanPropertyPathReferenceSet(com.intellij.struts2.reference.common.BeanPropertyPathReferenceSet) Result(com.intellij.struts2.dom.struts.action.Result) NotNull(org.jetbrains.annotations.NotNull)

Example 3 with Action

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");
}
Also used : ThemeReferenceProvider(com.intellij.struts2.reference.jsp.ThemeReferenceProvider) ActionMethodReferenceProvider(com.intellij.struts2.reference.jsp.ActionMethodReferenceProvider) NamespaceReferenceProvider(com.intellij.struts2.reference.jsp.NamespaceReferenceProvider)

Example 4 with Action

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;
}
Also used : ParamNameConverter(com.intellij.struts2.dom.params.ParamNameConverter) Action(com.intellij.struts2.dom.struts.action.Action) HasResultType(com.intellij.struts2.dom.struts.HasResultType) ParamsElement(com.intellij.struts2.dom.params.ParamsElement) ActionMethodConverter(com.intellij.struts2.dom.struts.action.ActionMethodConverter) StrutsPathReferenceConverter(com.intellij.struts2.dom.struts.action.StrutsPathReferenceConverter) ExtendableClassConverter(com.intellij.struts2.dom.ExtendableClassConverter) ParamNameConverter(com.intellij.struts2.dom.params.ParamNameConverter) HasResultType(com.intellij.struts2.dom.struts.HasResultType) ResultType(com.intellij.struts2.dom.struts.strutspackage.ResultType) StrutsPathReferenceConverter(com.intellij.struts2.dom.struts.action.StrutsPathReferenceConverter) ActionMethodConverter(com.intellij.struts2.dom.struts.action.ActionMethodConverter) ExtendableClassConverter(com.intellij.struts2.dom.ExtendableClassConverter) Result(com.intellij.struts2.dom.struts.action.Result)

Example 5 with Action

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) };
}
Also used : Action(com.intellij.struts2.dom.struts.action.Action) PsiReference(com.intellij.psi.PsiReference) Result(com.intellij.struts2.dom.struts.action.Result) NotNull(org.jetbrains.annotations.NotNull)

Aggregations

Action (com.intellij.struts2.dom.struts.action.Action)15 StrutsModel (com.intellij.struts2.dom.struts.model.StrutsModel)10 Result (com.intellij.struts2.dom.struts.action.Result)8 NotNull (org.jetbrains.annotations.NotNull)8 PathReference (com.intellij.openapi.paths.PathReference)5 StrutsManager (com.intellij.struts2.dom.struts.model.StrutsManager)5 Module (com.intellij.openapi.module.Module)4 PsiElement (com.intellij.psi.PsiElement)4 PsiReference (com.intellij.psi.PsiReference)3 XmlFile (com.intellij.psi.xml.XmlFile)3 XmlTag (com.intellij.psi.xml.XmlTag)3 ArrayList (java.util.ArrayList)3 PsiElementBaseIntentionAction (com.intellij.codeInsight.intention.PsiElementBaseIntentionAction)2 WriteCommandAction (com.intellij.openapi.command.WriteCommandAction)2 HasResultType (com.intellij.struts2.dom.struts.HasResultType)2 ResultType (com.intellij.struts2.dom.struts.strutspackage.ResultType)2 StrutsPackage (com.intellij.struts2.dom.struts.strutspackage.StrutsPackage)2 DomElement (com.intellij.util.xml.DomElement)2 NonNls (org.jetbrains.annotations.NonNls)2 DomGotoRelatedItem (com.intellij.codeInsight.navigation.DomGotoRelatedItem)1