[jbosstools-issues] [JBoss JIRA] (JBIDE-25748) Discovery of "foreign" bean types for JSF auto-complete
Jeff MAURY (JIRA)
issues at jboss.org
Wed Apr 18 12:13:11 EDT 2018
[ https://issues.jboss.org/browse/JBIDE-25748?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Jeff MAURY updated JBIDE-25748:
-------------------------------
Fix Version/s: 4.6.x
(was: 4.5.x)
> Discovery of "foreign" bean types for JSF auto-complete
> -------------------------------------------------------
>
> Key: JBIDE-25748
> URL: https://issues.jboss.org/browse/JBIDE-25748
> Project: Tools (JBoss Tools)
> Issue Type: Feature Request
> Components: cdi, jsf
> Affects Versions: 4.5.2.Final
> Environment: Eclipse Oxygen, but every version should be affected.
> Also every version of JBoss Tools since 2012 (last change date of the modified files below).
> Reporter: Thies .
> Assignee: Jeff MAURY
> Fix For: 4.6.x
>
>
> Auto-complete in JSF supports {{@ManagedBean}} and {{@Named}}, fine.
> But it is also possible to use "foreign" beans, concretely Spring via {{@Controller}}.
> I manually implemented a "hack" (see also https://stackoverflow.com/questions/48933757/el-autocomplete-code-assist-with-eclipse-and-spring-beans/48933758#48933758) by simply extending a single classes method.
> For JSF only extend class {{org.jboss.tools.jsf.jsf2.bean.model.impl.AbstractMemberDefinition}} methods {{getManagedBeanAnnotation()}} and {{isAnnotationPresent()}}:
> {code:java}
> public boolean isAnnotationPresent(String annotationTypeName) {
> //TW: added Spring annotations
> boolean b = (getAnnotation(annotationTypeName) != null);
> if (!b && JSF2Constants.MANAGED_BEAN_ANNOTATION_TYPE_NAME.equals(annotationTypeName)) {
> b = (getAnnotation("org.springframework.stereotype.Controller") != null);
> /* with support for all Spring annotations:
> b = (getAnnotation("org.springframework.stereotype.Controller") != null
> || getAnnotation("org.springframework.stereotype.Service") != null
> || getAnnotation("org.springframework.stereotype.Repository") != null
> || getAnnotation("org.springframework.stereotype.Component") != null);
> */
> }
> return b;
> }
> public AnnotationDeclaration getManagedBeanAnnotation() {
> AnnotationDeclaration ad = annotationsByType.get(JSF2Constants.MANAGED_BEAN_ANNOTATION_TYPE_NAME);
> //TW: added Spring annotations
> if (ad != null) return ad;
> ad = annotationsByType.get("org.springframework.stereotype.Controller");
> /* with support for all Spring annotations:
> if (ad == null) ad = annotationsByType.get("org.springframework.stereotype.Service");
> if (ad == null) ad = annotationsByType.get("org.springframework.stereotype.Repository");
> if (ad == null) ad = annotationsByType.get("org.springframework.stereotype.Component");
> */
> if (ad != null) {
> // create wrapper to map "value" (used by Spring) to "name" (which is used by @ManageBean)
> ad = new AnnotationDeclaration() {
> private AnnotationDeclaration wrapped;
> AnnotationDeclaration init(AnnotationDeclaration wrappedAD) {
> this.wrapped = wrappedAD;
> return this;
> }
> @Override
> public Object getMemberValue(String name) {
> Object val = wrapped.getMemberValue(name);
> if (val == null && "name".equals(name)) {
> val = wrapped.getMemberValue(null);
> }
> return val;
> }
> @Override
> public Object getMemberValue(String name, boolean resolve) {
> Object result = null;
> if (resolve) {
> result = this.getMemberConstantValue(name);
> }
> if (result == null) {
> result = this.getMemberValue(name);
> }
> return result;
> }
> @Override
> public void setDeclaration(IJavaAnnotation annotation) {
> wrapped.setDeclaration(annotation);
> }
> @Override
> public IJavaAnnotation getDeclaration() {
> return wrapped.getDeclaration();
> }
> @Override
> public IResource getResource() {
> return wrapped.getResource();
> }
> @Override
> public IMemberValuePair[] getMemberValuePairs() {
> return wrapped.getMemberValuePairs();
> }
> @Override
> public Object getMemberConstantValue(String name) {
> return wrapped.getMemberConstantValue(name);
> }
> @Override
> public Object getMemberDefaultValue(String name) {
> return wrapped.getMemberDefaultValue(name);
> }
> @Override
> public IMember getParentMember() {
> return wrapped.getParentMember();
> }
> @Override
> public String getTypeName() {
> return wrapped.getTypeName();
> }
> @Override
> public IType getType() {
> return wrapped.getType();
> }
> @Override
> public int getLength() {
> return wrapped.getLength();
> }
> @Override
> public int getStartPosition() {
> return wrapped.getStartPosition();
> }
> @Override
> public IAnnotationType getAnnotation() {
> return wrapped.getAnnotation();
> }
> @Override
> public IAnnotation getJavaAnnotation() {
> return wrapped.getJavaAnnotation();
> }
> @Override
> public IMember getSourceMember() {
> return wrapped.getSourceMember();
> }
> @Override
> public IJavaElement getSourceElement() {
> return wrapped.getSourceElement();
> }
> }.init(ad); // class
> }
> return ad;
> }
> {code}
> For CDI extend class {{org.jboss.tools.cdi.internal.core.impl.definition.AbstractMemberDefinition}} method {{getNamedAnnotation()}}:
> {code:java}
> public AnnotationDeclaration getNamedAnnotation() {
> AnnotationDeclaration ad = getAnnotation(CDIConstants.NAMED_QUALIFIER_TYPE_NAME);
> //TW: added Spring annotations
> if (ad != null) return ad;
> ad = getAnnotation("org.springframework.stereotype.Controller");
> /* add additional Spring annotations, if desired:
> if (ad != null) return ad;
> ad = getAnnotation("org.springframework.stereotype.Service");
> if (ad != null) return ad;
> ad = getAnnotation("org.springframework.stereotype.Repository");
> if (ad != null) return ad;
> ad = getAnnotation("org.springframework.stereotype.Component");
> */
> return ad;
> }
> {code}
> Best would be to offer a preferences String, that allows to add arbitrary annotations - maybe even a project specific setting.
--
This message was sent by Atlassian JIRA
(v7.5.0#75005)
More information about the jbosstools-issues
mailing list