diff --git a/.gitignore b/.gitignore index cca3574..f51de0a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,9 @@ *.iml -mybatis-plus.jar log.roo .idea/ out/ .DS_Store +.floo +.flooignore + +META-INF/plugin.xml \ No newline at end of file diff --git a/META-INF/plugin.xml b/META-INF/plugin.xml index e2c31f1..a2f403b 100644 --- a/META-INF/plugin.xml +++ b/META-INF/plugin.xml @@ -1,8 +1,8 @@ com.seventh7.plugin.mybatis MyBatis plugin - 2.01 - Yanglin + 2.31 + Yanglin @@ -10,42 +10,21 @@ ]]> 2.01 +

2.31

-

1.56

+

2.3

-

1.46

- ]]>
- - com.intellij.sql - com.intellij.spring + + com.intellij.spring + com.intellij.database @@ -57,7 +36,6 @@ - @@ -66,20 +44,30 @@ + + com.seventh7.mybatis.intention.GenerateParamAnnotationIntention - - com.seventh7.mybatis.intention.GenerateStatementIntention - com.seventh7.mybatis.intention.GenerateMapperIntention + + com.seventh7.mybatis.intention.AliasSwitchIntentionAction + + + + + + +
\ No newline at end of file diff --git a/README.md b/README.md index c999bc3..68bbee3 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,11 @@ +# Ad - 强势推荐 + +翻墙利器: http://honx.in/i/VJ6-U86vD0s1XqbE + +# Supported By + +![Thanks to the support of JetBrains](http://www.jetbrains.com/company/docs/logo_jetbrains.png) + #Download * http://plugins.jetbrains.com/plugin/7293 @@ -13,11 +21,17 @@ * Support refactor for id based tag in mapper xml * Support find usage of mapper interface and mapper xml element * Highlight conflicting element of mapper xml as errors -* Auto register mapper as spring bean -* Mapper parameter auto completion in xml while editting sql +* Auto register mapper as spring bean +* Support completion of jdbc type in mapper xml +* Support completion of referencing to select statement in mapper xml +* Support switching between java type and alias in mapper xml using intention keystroke +* Auto inject sql language in mapper xml +* Mapper parameter auto completion in xml while editing sql * \#{yourParameter} * @Param annotation based * Association is supported +* Support generating properties for elements of result map using intention keystroke + * DataSource of intellij is required #Generate diff --git a/lib/gson-2.2.4.jar b/lib/gson-2.2.4.jar new file mode 100644 index 0000000..9478253 Binary files /dev/null and b/lib/gson-2.2.4.jar differ diff --git a/mybatis-plus.jar b/mybatis-plus.jar new file mode 100644 index 0000000..9ae3d09 Binary files /dev/null and b/mybatis-plus.jar differ diff --git a/src/com/seventh7/mybatis/action/HackAction.java b/src/com/seventh7/mybatis/action/HackAction.java new file mode 100644 index 0000000..54ea27b --- /dev/null +++ b/src/com/seventh7/mybatis/action/HackAction.java @@ -0,0 +1,16 @@ +package com.seventh7.mybatis.action; + +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; + +/** + * @author yanglin + */ +public class HackAction extends AnAction { + + + public void actionPerformed(AnActionEvent e) { + // NON + } + +} diff --git a/src/com/seventh7/mybatis/action/MybatisTypedHandler.java b/src/com/seventh7/mybatis/action/MybatisTypedHandler.java index 34a762c..821e090 100644 --- a/src/com/seventh7/mybatis/action/MybatisTypedHandler.java +++ b/src/com/seventh7/mybatis/action/MybatisTypedHandler.java @@ -4,9 +4,10 @@ import com.intellij.codeInsight.completion.CompletionType; import com.intellij.codeInsight.editorActions.CompletionAutoPopupHandler; import com.intellij.codeInsight.editorActions.TypedHandlerDelegate; +import com.intellij.diagnostic.LogEventException; +import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiFile; import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; import com.intellij.sql.psi.SqlFile; @@ -30,12 +31,19 @@ public Result checkAutoPopup(char charTyped, final Project project, final Editor @Override public Result charTyped(char c, final Project project, @NotNull final Editor editor, @NotNull PsiFile file) { + if (c != '{') { + return Result.CONTINUE; + } int index = editor.getCaretModel().getOffset() - 2; + if (index < 0) { + return Result.CONTINUE; + } + char beginningChar = editor.getDocument().getText().charAt(index); + if (beginningChar != '#' && beginningChar != '$') { + return Result.CONTINUE; + } PsiFile topLevelFile = InjectedLanguageUtil.getTopLevelFile(file); - boolean parameterCase = c == '{' && - index >= 0 && - editor.getDocument().getText().charAt(index) == '#' && - file instanceof SqlFile && + boolean parameterCase = file instanceof SqlFile && DomUtils.isMybatisFile(topLevelFile); if (parameterCase) { autoPopupParameter(project, editor); @@ -45,11 +53,13 @@ public Result charTyped(char c, final Project project, @NotNull final Editor edi } private static void autoPopupParameter(final Project project, final Editor editor) { - CompletionAutoPopupHandler.runLaterWithCommitted(project, editor.getDocument(), new Runnable() { + final Document document = editor.getDocument(); + CompletionAutoPopupHandler.runLaterWithCommitted(project, document, new Runnable() { @Override public void run() { - if (PsiDocumentManager.getInstance(project).isCommitted(editor.getDocument())) { + try { new CodeCompletionHandlerBase(CompletionType.BASIC).invokeCompletion(project, editor, 1); + } catch (LogEventException ignored) { } } }); diff --git a/src/com/seventh7/mybatis/alias/AliasClassReference.java b/src/com/seventh7/mybatis/alias/AliasClassReference.java index 143ccdc..ea71113 100644 --- a/src/com/seventh7/mybatis/alias/AliasClassReference.java +++ b/src/com/seventh7/mybatis/alias/AliasClassReference.java @@ -3,7 +3,7 @@ import com.google.common.base.Function; import com.google.common.collect.Collections2; -import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiClass; import com.intellij.psi.PsiReferenceBase; import com.intellij.psi.xml.XmlAttributeValue; @@ -29,7 +29,7 @@ public AliasClassReference(@NotNull XmlAttributeValue element) { } @Nullable @Override - public PsiElement resolve() { + public PsiClass resolve() { XmlAttributeValue attributeValue = getElement(); return AliasFacade.getInstance(attributeValue.getProject()).findPsiClass(attributeValue, attributeValue.getValue()).orNull(); } diff --git a/src/com/seventh7/mybatis/alias/AliasDesc.java b/src/com/seventh7/mybatis/alias/AliasDesc.java index f55eddd..5c685a4 100644 --- a/src/com/seventh7/mybatis/alias/AliasDesc.java +++ b/src/com/seventh7/mybatis/alias/AliasDesc.java @@ -55,11 +55,8 @@ public boolean equals(Object o) { if (alias != null ? !alias.equals(aliasDesc.alias) : aliasDesc.alias != null) { return false; } - if (clazz != null ? !clazz.equals(aliasDesc.clazz) : aliasDesc.clazz != null) { - return false; - } - return true; + return !(clazz != null ? !clazz.equals(aliasDesc.clazz) : aliasDesc.clazz != null); } @Override diff --git a/src/com/seventh7/mybatis/alias/AliasFacade.java b/src/com/seventh7/mybatis/alias/AliasFacade.java index fb1375c..fa50d26 100644 --- a/src/com/seventh7/mybatis/alias/AliasFacade.java +++ b/src/com/seventh7/mybatis/alias/AliasFacade.java @@ -5,10 +5,9 @@ import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.project.Project; -import com.intellij.psi.JavaPsiFacade; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; -import com.intellij.psi.search.GlobalSearchScope; +import com.seventh7.mybatis.util.JavaUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -24,18 +23,15 @@ public class AliasFacade { private Project project; - private JavaPsiFacade javaPsiFacade; - private List resolvers; - public static final AliasFacade getInstance(@NotNull Project project) { + public static AliasFacade getInstance(@NotNull Project project) { return ServiceManager.getService(project, AliasFacade.class); } public AliasFacade(Project project) { this.project = project; this.resolvers = Lists.newArrayList(); - this.javaPsiFacade = JavaPsiFacade.getInstance(project); initResolvers(); } @@ -43,7 +39,7 @@ private void initResolvers() { try { Class.forName("com.intellij.spring.model.utils.SpringModelUtils"); this.registerResolver(AliasResolverFactory.createBeanResolver(project)); - } catch (ClassNotFoundException e) { + } catch (ClassNotFoundException ignored) { } this.registerResolver(AliasResolverFactory.createSingleAliasResolver(project)); this.registerResolver(AliasResolverFactory.createConfigPackageResolver(project)); @@ -52,14 +48,14 @@ private void initResolvers() { } @NotNull - public Optional findPsiClass(@Nullable PsiElement element, @NotNull String shortName) { - PsiClass clazz = javaPsiFacade.findClass(shortName, GlobalSearchScope.allScope(project)); - if (null != clazz) { - return Optional.of(clazz); + public Optional findPsiClass(@Nullable PsiElement element, @NotNull String clazzName) { + final Optional clazz = JavaUtils.findClazz(project, clazzName); + if (clazz.isPresent()) { + return clazz; } for (AliasResolver resolver : resolvers) { for (AliasDesc desc : resolver.getClassAliasDescriptions(element)) { - if (desc.getAlias().equals(shortName)) { + if (desc.getAlias().equalsIgnoreCase(clazzName)) { return Optional.of(desc.getClazz()); } } diff --git a/src/com/seventh7/mybatis/alias/AnnotationAliasResolver.java b/src/com/seventh7/mybatis/alias/AnnotationAliasResolver.java index 10620de..5180bfe 100644 --- a/src/com/seventh7/mybatis/alias/AnnotationAliasResolver.java +++ b/src/com/seventh7/mybatis/alias/AnnotationAliasResolver.java @@ -41,12 +41,13 @@ public AnnotationAliasResolver(Project project) { super(project); } - public static final AnnotationAliasResolver getInstance(@NotNull Project project) { + public static AnnotationAliasResolver getInstance(@NotNull Project project) { return project.getComponent(AnnotationAliasResolver.class); } @NotNull @Override + @SuppressWarnings("unchecked") public Set getClassAliasDescriptions(@Nullable PsiElement element) { Optional clazz = Annotation.ALIAS.toPsiClass(project); if (clazz.isPresent()) { diff --git a/src/com/seventh7/mybatis/alias/BeanAliasResolver.java b/src/com/seventh7/mybatis/alias/BeanAliasResolver.java index 32b03be..2ab86f1 100644 --- a/src/com/seventh7/mybatis/alias/BeanAliasResolver.java +++ b/src/com/seventh7/mybatis/alias/BeanAliasResolver.java @@ -8,33 +8,37 @@ import com.intellij.psi.PsiElement; import com.intellij.spring.CommonSpringModel; import com.intellij.spring.SpringManager; -import com.intellij.spring.model.SpringBeanPointer; -import com.intellij.spring.model.utils.SpringPropertyUtils; import com.intellij.spring.model.xml.beans.SpringPropertyDefinition; +import com.intellij.util.Processor; +import com.seventh7.mybatis.util.SpringUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Collection; +import java.util.Collections; import java.util.Set; /** * @author yanglin */ -public class BeanAliasResolver extends PackageAliasResolver{ +public class BeanAliasResolver extends PackageAliasResolver { private static final String MAPPER_ALIAS_PACKAGE_CLASS = "org.mybatis.spring.SqlSessionFactoryBean"; private static final String MAPPER_ALIAS_PROPERTY = "typeAliasesPackage"; private ModuleManager moduleManager; private SpringManager springManager; + private Project project; public BeanAliasResolver(Project project) { super(project); this.moduleManager = ModuleManager.getInstance(project); this.springManager = SpringManager.getInstance(project); + this.project = project; } - @NotNull @Override + @NotNull + @Override public Collection getPackages(@Nullable PsiElement element) { Set res = Sets.newHashSet(); for (Module module : moduleManager.getModules()) { @@ -45,16 +49,18 @@ public Collection getPackages(@Nullable PsiElement element) { return res; } - private void addPackages(Set res, CommonSpringModel springModel) { - for (SpringBeanPointer springBaseBeanPointer : springModel.findBeansByPsiClassWithInheritance(MAPPER_ALIAS_PACKAGE_CLASS)) { - SpringPropertyDefinition basePackages = SpringPropertyUtils.findPropertyByName(springBaseBeanPointer.getSpringBean(), MAPPER_ALIAS_PROPERTY); - if (basePackages != null) { - final String value = basePackages.getValueElement().getStringValue(); + private void addPackages(final Set res, CommonSpringModel springModel) { + Processor processor = new Processor() { + @Override + public boolean process(SpringPropertyDefinition def) { + final String value = def.getValueElement().getStringValue(); if (value != null) { - res.add(value); + Collections.addAll(res, value.split(",|;")); } + return true; } - } + }; + SpringUtils.processSpringConfig(project, springModel, MAPPER_ALIAS_PACKAGE_CLASS, MAPPER_ALIAS_PROPERTY, processor); } } diff --git a/src/com/seventh7/mybatis/annotation/Annotation.java b/src/com/seventh7/mybatis/annotation/Annotation.java index 8569f49..eb16bc0 100644 --- a/src/com/seventh7/mybatis/annotation/Annotation.java +++ b/src/com/seventh7/mybatis/annotation/Annotation.java @@ -1,18 +1,16 @@ package com.seventh7.mybatis.annotation; import com.google.common.base.Optional; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; -import com.google.common.collect.Maps; import com.intellij.openapi.project.Project; -import com.intellij.psi.JavaPsiFacade; import com.intellij.psi.PsiClass; -import com.intellij.psi.search.GlobalSearchScope; +import com.seventh7.mybatis.util.JavaUtils; import org.jetbrains.annotations.NotNull; -import java.util.Map; import java.util.Set; /** @@ -43,7 +41,7 @@ public class Annotation implements Cloneable{ private final String qualifiedName; - private Map attributePairs; + private ImmutableMap attributePairs; public interface AnnotationValue { } @@ -66,18 +64,16 @@ public String toString() { public Annotation(@NotNull String label, @NotNull String qualifiedName) { this.label = label; this.qualifiedName = qualifiedName; - attributePairs = Maps.newHashMap(); - } - - private Annotation addAttribute(String key, AnnotationValue value) { - this.attributePairs.put(key, value); - return this; + this.attributePairs = ImmutableMap.of(); } public Annotation withAttribute(@NotNull String key, @NotNull AnnotationValue value) { Annotation copy = this.clone(); - copy.attributePairs = Maps.newHashMap(this.attributePairs); - return copy.addAttribute(key, value); + copy.attributePairs = ImmutableMap.builder() + .putAll(this.attributePairs) + .put(key, value) + .build(); + return copy; } public Annotation withValue(@NotNull AnnotationValue value) { @@ -87,7 +83,7 @@ public Annotation withValue(@NotNull AnnotationValue value) { @Override public String toString() { StringBuilder builder = new StringBuilder(label); - if (!Iterables.isEmpty(attributePairs.entrySet())) { + if (!attributePairs.isEmpty()) { builder.append(setupAttributeText()); } return builder.toString(); @@ -106,24 +102,21 @@ private String getComplexValue() { builder.append(attributePairs.get(key).toString()); builder.append(", "); } - builder.deleteCharAt(builder.length() - 1); - builder.deleteCharAt(builder.length() - 1); + int length = builder.length(); + builder.delete(length - 2, length); builder.append(")"); return builder.toString(); } @NotNull public Optional toPsiClass(@NotNull Project project) { - return Optional.fromNullable(JavaPsiFacade.getInstance(project).findClass(getQualifiedName(), GlobalSearchScope.allScope(project))); + return JavaUtils.findClazz(project, getQualifiedName()); } private Optional getSingleValue() { try { String value = Iterables.getOnlyElement(attributePairs.keySet()); - StringBuilder builder = new StringBuilder("("); - builder.append(attributePairs.get(value).toString()); - builder.append(")"); - return Optional.of(builder.toString()); + return Optional.of("(" + attributePairs.get(value).toString() + ")"); } catch (Exception e) { return Optional.absent(); } diff --git a/src/com/seventh7/mybatis/contributor/SqlParamCompletionContributor.java b/src/com/seventh7/mybatis/contributor/SqlParamCompletionContributor.java index 53047ab..c765f3c 100644 --- a/src/com/seventh7/mybatis/contributor/SqlParamCompletionContributor.java +++ b/src/com/seventh7/mybatis/contributor/SqlParamCompletionContributor.java @@ -14,6 +14,8 @@ import com.seventh7.mybatis.util.DomUtils; import com.seventh7.mybatis.util.MapperUtils; +import org.jetbrains.annotations.NotNull; + /** * @author yanglin @@ -21,7 +23,7 @@ public class SqlParamCompletionContributor extends CompletionContributor { @Override - public void fillCompletionVariants(CompletionParameters parameters, final CompletionResultSet result) { + public void fillCompletionVariants(@NotNull CompletionParameters parameters, @NotNull final CompletionResultSet result) { if (parameters.getCompletionType() != CompletionType.BASIC) { return; } @@ -51,7 +53,9 @@ private boolean shouldAddElement(PsiFile file, int offset) { String text = file.getText(); for (int i = offset - 1; i > 0; i--) { char c = text.charAt(i); - if (c == '{' && text.charAt(i - 1) == '#') return true; + if (c == '{' && (text.charAt(i - 1) == '#' || text.charAt(i - 1) == '$')) { + return true; + } } return false; } diff --git a/src/com/seventh7/mybatis/contributor/TestParamContributor.java b/src/com/seventh7/mybatis/contributor/TestParamContributor.java index 8feb444..873c351 100644 --- a/src/com/seventh7/mybatis/contributor/TestParamContributor.java +++ b/src/com/seventh7/mybatis/contributor/TestParamContributor.java @@ -1,6 +1,8 @@ package com.seventh7.mybatis.contributor; import com.google.common.base.Optional; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Lists; import com.intellij.codeInsight.completion.CompletionContributor; import com.intellij.codeInsight.completion.CompletionParameters; @@ -11,11 +13,21 @@ import com.intellij.codeInsight.lookup.LookupElementBuilder; import com.intellij.openapi.project.Project; import com.intellij.patterns.XmlPatterns; +import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiField; +import com.intellij.psi.PsiMethod; +import com.intellij.psi.PsiModifier; +import com.intellij.psi.PsiModifierList; import com.intellij.psi.PsiParameter; +import com.intellij.psi.PsiPrimitiveType; +import com.intellij.psi.PsiType; +import com.intellij.psi.impl.source.PsiClassReferenceType; +import com.intellij.util.PlatformIcons; import com.intellij.util.ProcessingContext; import com.seventh7.mybatis.annotation.Annotation; import com.seventh7.mybatis.dom.model.IdDomElement; +import com.seventh7.mybatis.util.CollectionUtils; import com.seventh7.mybatis.util.Icons; import com.seventh7.mybatis.util.JavaUtils; import com.seventh7.mybatis.util.MapperUtils; @@ -24,34 +36,142 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + /** * @author yanglin */ public class TestParamContributor extends CompletionContributor { + private final static Collection HANDLER_CHAIN = ImmutableSet.of( + new AnnotationParameterLookupHandler(), + new ModelParameterLookupHandler(), + new PrimitiveParameterLookupHandler() + ); + @SuppressWarnings("unchecked") public TestParamContributor() { + final CompletionProvider provider = new CompletionProvider() { + @Override + protected void addCompletions(@NotNull CompletionParameters parameters, + ProcessingContext context, + @NotNull CompletionResultSet result) { + PsiElement position = parameters.getPosition(); + addElementForPsiParameter(position.getProject(), result, MapperUtils.findParentIdDomElement(position).orNull()); + } + }; extend(CompletionType.BASIC, - XmlPatterns.psiElement().inside(XmlPatterns.xmlAttributeValue().inside(XmlPatterns.xmlAttribute().withName("test"))), - new CompletionProvider() { - @Override - protected void addCompletions(@NotNull CompletionParameters parameters, ProcessingContext context, @NotNull CompletionResultSet result) { - PsiElement position = parameters.getPosition(); - addElementForPsiParameter(position.getProject(), result, MapperUtils.findParentIdDomElement(position).orNull()); - } - }); + XmlPatterns.psiElement().inside(XmlPatterns.xmlAttributeValue().inside(XmlPatterns.xmlAttribute().withName("test"))), provider); + extend(CompletionType.BASIC, + XmlPatterns.psiElement().inside(XmlPatterns.xmlAttributeValue().inside(XmlPatterns.xmlAttribute().withName("collection"))), provider); } public static void addElementForPsiParameter(@NotNull Project project, @NotNull CompletionResultSet result, @Nullable IdDomElement element) { if (null == element) { return; } - for (PsiParameter parameter : JavaUtils.findMethod(project, element).get().getParameterList().getParameters()) { + Optional method = JavaUtils.findMethod(project, element); + if (!method.isPresent()) { + return; + } + for (PsiParameter parameter : method.get().getParameterList().getParameters()) { + for (SimpleParameterLookupHandler handler : HANDLER_CHAIN) { + handler.handle(result, parameter); + } + } + } + + private abstract static class SimpleParameterLookupHandler { + + public void handle(@NotNull CompletionResultSet result, @NotNull PsiParameter parameter) { + Collection lookupElements = getParameterLookupElements(parameter); + if (CollectionUtils.isEmpty(lookupElements)) { + return; + } + for (Object lookupElement : lookupElements) { + LookupElementBuilder builder = null; + if (lookupElement instanceof String) { + builder = LookupElementBuilder.create((String) lookupElement).withIcon(Icons.PARAM_COMPLETION_ICON); + } else if (lookupElement instanceof PsiField) { + builder = LookupElementBuilder.create((PsiField) lookupElement).withIcon(PlatformIcons.FIELD_ICON); + } + if (null != builder) { + result.addElement(PrioritizedLookupElement.withPriority(builder, MybatisConstants.PRIORITY)); + } + } + } + + @NotNull + public abstract Collection getParameterLookupElements(@NotNull PsiParameter parameter); + } + + private final static class AnnotationParameterLookupHandler extends SimpleParameterLookupHandler { + + @NotNull + @Override + public Collection getParameterLookupElements(@NotNull PsiParameter parameter) { Optional valueText = JavaUtils.getAnnotationValueText(parameter, Annotation.PARAM); - if (valueText.isPresent()) { - LookupElementBuilder builder = LookupElementBuilder.create(valueText.get()).withIcon(Icons.PARAM_COMPLETION_ICON); - result.addElement(PrioritizedLookupElement.withPriority(builder, MybatisConstants.PRIORITY)); + return valueText.isPresent() ? Lists.newArrayList(valueText.get()) : Collections.emptyList(); + } + + } + + private abstract static class NoParamAnnotationPresentParameterLookupHandler extends SimpleParameterLookupHandler { + + @NotNull + @Override + public Collection getParameterLookupElements(@NotNull PsiParameter parameter) { + Optional valueText = JavaUtils.getAnnotationValueText(parameter, Annotation.PARAM); + return valueText.isPresent() ? Collections.emptyList() : doHandle(parameter); + } + + @NotNull + public abstract Collection doHandle(@NotNull PsiParameter parameter); + } + + private final static class PrimitiveParameterLookupHandler extends NoParamAnnotationPresentParameterLookupHandler { + + @NotNull + @Override + public Collection doHandle(@NotNull PsiParameter parameter) { + return parameter.getType() instanceof PsiPrimitiveType + ? Lists.newArrayList(parameter.getName()) + : Collections.emptyList(); + } + } + + private final static class ModelParameterLookupHandler extends NoParamAnnotationPresentParameterLookupHandler { + + @NotNull + @Override + public Collection doHandle(@NotNull PsiParameter parameter) { + PsiType type = parameter.getType(); + if (!(type instanceof PsiClassReferenceType)) { return Collections.emptyList(); } + + PsiClass clazz = ((PsiClassReferenceType) type).resolve(); + if (null == clazz) { return Collections.emptyList(); } + + List res = Lists.newArrayList(); + res.add(parameter.getName()); + PsiField[] psiFields = clazz.getAllFields(); + for (PsiField psiField : psiFields) { + PsiModifierList modifierList = psiField.getModifierList(); + if (modifierList == null) { + continue; + } + boolean propSettable = !modifierList.hasModifierProperty(PsiModifier.STATIC) && + !modifierList.hasModifierProperty(PsiModifier.NATIVE) && + !modifierList.hasModifierProperty(PsiModifier.TRANSIENT) && + !modifierList.hasModifierProperty(PsiModifier.FINAL); + if (propSettable) { + res.add(psiField); + } } + return res; } + } + } diff --git a/src/com/seventh7/mybatis/db/ColumnsSelector.java b/src/com/seventh7/mybatis/db/ColumnsSelector.java new file mode 100644 index 0000000..9adbf72 --- /dev/null +++ b/src/com/seventh7/mybatis/db/ColumnsSelector.java @@ -0,0 +1,115 @@ +package com.seventh7.mybatis.db; + +import com.google.common.base.Function; + +import com.intellij.database.dataSource.DataSource; +import com.intellij.database.dataSource.DataSourceManager; +import com.intellij.database.dataSource.DatabaseTableData; +import com.intellij.database.dataSource.DatabaseTableFieldData; +import com.intellij.openapi.project.Project; +import com.seventh7.mybatis.setting.MybatisSetting; +import com.seventh7.mybatis.ui.ListSelectionItemListener; +import com.seventh7.mybatis.ui.UiComponentFacade; + +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; +import java.util.List; + + +/** + * @author yanglin + */ +public class ColumnsSelector { + + public static void selectColumns(@NotNull Project project, @NotNull ListSelectionItemListener listener) { + DataSourceManager dataSourceManager = DataSourceManager.getInstance(project); + + String dlftDataSourceId = MybatisSetting.getInstance().getDefaultDataSourceId(); + DataSource defaultDataSource = dataSourceManager.getDataSourceByID(dlftDataSourceId); + final UiComponentFacade uiFacade = UiComponentFacade.getInstance(project); + if (defaultDataSource == null) { + selectDataSourceAndApply(listener, dataSourceManager, uiFacade); + } else { + selectTableAndApply(uiFacade, defaultDataSource.getTables(), listener); + } + } + + private static void selectDataSourceAndApply(final ListSelectionItemListener listener, + DataSourceManager dataSourceManager, + final UiComponentFacade uiFacade) { + uiFacade.selectItems("[Select Data Source]", + dataSourceManager.getDataSources(), + new ListSelectionItemListener() { + @Override public void apply(DataSource dataSource) { + MybatisSetting.getInstance().setDefaultDataSourceId(dataSource.getUniqueId()); + selectTableAndApply(uiFacade, dataSource.getTables(), listener); + } + }, new Function() { + @Override public String apply(DataSource dataSource) { + return dataSource.getName(); + } + } + ); + } + + private static void selectTableAndApply(final UiComponentFacade uiFacade, + List table, + final ListSelectionItemListener listener) { + uiFacade.selectItems("[Select Table]", + table, + new ListSelectionItemListener() { + @Override public void apply(DatabaseTableData dataSource) { + selectColumnsAndApply(uiFacade, dataSource.getColumns(), listener); + } + + }, new Function() { + @Override public String apply(DatabaseTableData table) { + return table.getName(); + } + } + ); + } + + private static void selectColumnsAndApply(UiComponentFacade uiFacade, + List columns, + final ListSelectionItemListener listener) { + uiFacade.selectItems("[Select Columns]", + columns, + new ListSelectionItemListener() { + @Override + public void apply(Collection columns) { + listener.apply(columns); + } + + @Override + public void apply(DatabaseTableFieldData columns) { + listener.apply(columns); + } + + @Override public boolean isWriteAction() { + return true; + } + }, new Function() { + @Override + public String apply(DatabaseTableFieldData column) { + return getColumnText(column); + } + } + ); + } + + private static String getColumnText(DatabaseTableFieldData column) { + final String name = column.getName(); + if (column.isPrimary()) { + return name + " [primary key]"; + } else if (column.isForeign()) { + return name + " [foreign key]"; + } else if (!column.isNullable()) { + return name + " [not null]"; + } else { + return name; + } + } + +} diff --git a/src/com/seventh7/mybatis/definitionsearch/MapperDefinitionSearch.java b/src/com/seventh7/mybatis/definitionsearch/MapperDefinitionSearch.java index eeedab5..4e6b816 100644 --- a/src/com/seventh7/mybatis/definitionsearch/MapperDefinitionSearch.java +++ b/src/com/seventh7/mybatis/definitionsearch/MapperDefinitionSearch.java @@ -32,6 +32,6 @@ public boolean process(DomElement domElement) { } }; - JavaService.getInstance(element.getProject()).process(element, processor); + JavaService.getInstance(element.getProject()).processMapperInterfaceElements(element, processor); } } diff --git a/src/com/seventh7/mybatis/dom/MapperBacktrackingUtils.java b/src/com/seventh7/mybatis/dom/MapperBacktrackingUtils.java index 587592b..883cf97 100644 --- a/src/com/seventh7/mybatis/dom/MapperBacktrackingUtils.java +++ b/src/com/seventh7/mybatis/dom/MapperBacktrackingUtils.java @@ -55,7 +55,7 @@ public static Optional getPropertyClazz(XmlAttributeValue attributeVal public static boolean isWithinSameTag(@NotNull DomElement domElement, @NotNull XmlElement xmlElement) { XmlTag xmlTag = PsiTreeUtil.getParentOfType(xmlElement, XmlTag.class); - return null != xmlElement && domElement.getXmlTag().equals(xmlTag); + return domElement.getXmlTag().equals(xmlTag); } } diff --git a/src/com/seventh7/mybatis/dom/converter/CacheRefNamespaceConverter.java b/src/com/seventh7/mybatis/dom/converter/CacheRefNamespaceConverter.java new file mode 100644 index 0000000..adfd1a1 --- /dev/null +++ b/src/com/seventh7/mybatis/dom/converter/CacheRefNamespaceConverter.java @@ -0,0 +1,46 @@ +package com.seventh7.mybatis.dom.converter; + +import com.google.common.base.Function; +import com.google.common.collect.Collections2; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiClass; +import com.intellij.util.xml.ConvertContext; +import com.seventh7.mybatis.dom.model.Mapper; +import com.seventh7.mybatis.util.JavaUtils; +import com.seventh7.mybatis.util.MapperUtils; + +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; + +/** + * @author yanglin + */ +public class CacheRefNamespaceConverter extends ConverterAdaptor { + + @NotNull @Override + public Collection getVariants(ConvertContext context) { + final Project project = context.getProject(); + final Collection mappers = MapperUtils.findMappers(project); + return Collections2.transform(mappers, new Function() { + @Override + public PsiClass apply(Mapper input) { + return JavaUtils.findClazz(project, input.getNamespace().getStringValue()).orNull(); + } + }); + } + + @Nullable @Override + public String toString(@Nullable PsiClass psiClass, ConvertContext context) { + return psiClass == null ? null : psiClass.getQualifiedName(); + } + + @Nullable @Override + public PsiClass fromString(@Nullable @NonNls String s, ConvertContext context) { + return JavaUtils.findClazz(context.getProject(), s).orNull(); + } + +} diff --git a/src/com/seventh7/mybatis/dom/converter/IdBasedTagConverter.java b/src/com/seventh7/mybatis/dom/converter/IdBasedTagConverter.java index 14cf5c1..ee39cf0 100644 --- a/src/com/seventh7/mybatis/dom/converter/IdBasedTagConverter.java +++ b/src/com/seventh7/mybatis/dom/converter/IdBasedTagConverter.java @@ -67,7 +67,10 @@ private Optional matchIdDomElement(Collection refs = Lists.newArrayList(super.getReferencesByString(text, position, offsetInPosition)); ValueReference vr = new ValueReference(position, getTextRange(position), context, text); if (!refs.isEmpty() && 0 != vr.getVariants().length) { + /** Just 'hack' the last reference */ refs.remove(refs.size() - 1); refs.add(vr); } diff --git a/src/com/seventh7/mybatis/dom/converter/JdbcTypeConverter.java b/src/com/seventh7/mybatis/dom/converter/JdbcTypeConverter.java new file mode 100644 index 0000000..16ff2f6 --- /dev/null +++ b/src/com/seventh7/mybatis/dom/converter/JdbcTypeConverter.java @@ -0,0 +1,31 @@ +package com.seventh7.mybatis.dom.converter; + +import com.google.common.collect.Sets; + +import com.intellij.util.xml.ConvertContext; +import com.seventh7.mybatis.util.SQLConstants; + +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; +import java.util.Set; + +/** + * @author yanglin + */ +public class JdbcTypeConverter extends PlainTextConverter { + + private static final Set TYPE_NAMES = Sets.newHashSet(); + + static { + for (int type : SQLConstants.sqlTypes()) { + TYPE_NAMES.add(SQLConstants.getJdbcTypeName(type)); + } + } + + @NotNull @Override + public Collection getVariants(ConvertContext context) { + return TYPE_NAMES; + } + +} diff --git a/src/com/seventh7/mybatis/dom/converter/PlainTextConverter.java b/src/com/seventh7/mybatis/dom/converter/PlainTextConverter.java new file mode 100644 index 0000000..2106ed9 --- /dev/null +++ b/src/com/seventh7/mybatis/dom/converter/PlainTextConverter.java @@ -0,0 +1,22 @@ +package com.seventh7.mybatis.dom.converter; + +import com.intellij.util.xml.ConvertContext; + +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.Nullable; + +/** + * @author yanglin + */ +public abstract class PlainTextConverter extends ConverterAdaptor { + + @Nullable @Override + public String toString(@Nullable String s, ConvertContext context) { + return s; + } + + @Nullable @Override + public String fromString(@Nullable @NonNls String s, ConvertContext context) { + return s; + } +} diff --git a/src/com/seventh7/mybatis/dom/converter/ReferenceToSelectConverter.java b/src/com/seventh7/mybatis/dom/converter/ReferenceToSelectConverter.java new file mode 100644 index 0000000..1e39c88 --- /dev/null +++ b/src/com/seventh7/mybatis/dom/converter/ReferenceToSelectConverter.java @@ -0,0 +1,22 @@ +package com.seventh7.mybatis.dom.converter; + +import com.intellij.util.xml.ConvertContext; +import com.seventh7.mybatis.dom.model.IdDomElement; +import com.seventh7.mybatis.dom.model.Mapper; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; + +/** + * @author yanglin + */ +public class ReferenceToSelectConverter extends IdBasedTagConverter { + + @NotNull @Override + public Collection getComparisons(@Nullable Mapper mapper, ConvertContext context) { + return mapper.getSelects(); + } + +} diff --git a/src/com/seventh7/mybatis/dom/converter/ResultSetTypeConverter.java b/src/com/seventh7/mybatis/dom/converter/ResultSetTypeConverter.java new file mode 100644 index 0000000..1bc0f89 --- /dev/null +++ b/src/com/seventh7/mybatis/dom/converter/ResultSetTypeConverter.java @@ -0,0 +1,24 @@ +package com.seventh7.mybatis.dom.converter; + +import com.google.common.collect.ImmutableSet; + +import com.intellij.util.xml.ConvertContext; + +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; +import java.util.Set; + +/** + * @author yanglin + */ +public class ResultSetTypeConverter extends PlainTextConverter { + + private static final Set TYPES = ImmutableSet.of("FORWARD_ONLY", "SCROLL_SENSITIVE", "SCROLL_INSENSITIVE"); + + @NotNull @Override + public Collection getVariants(ConvertContext context) { + return TYPES; + } + +} diff --git a/src/com/seventh7/mybatis/dom/converter/StatementTypeConverter.java b/src/com/seventh7/mybatis/dom/converter/StatementTypeConverter.java new file mode 100644 index 0000000..bc58697 --- /dev/null +++ b/src/com/seventh7/mybatis/dom/converter/StatementTypeConverter.java @@ -0,0 +1,24 @@ +package com.seventh7.mybatis.dom.converter; + +import com.google.common.collect.ImmutableSet; + +import com.intellij.util.xml.ConvertContext; + +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; +import java.util.Set; + +/** + * @author yanglin + */ +public class StatementTypeConverter extends PlainTextConverter { + + private static final Set TYPES = ImmutableSet.of("STATEMENT", "PREPARED", "CALLABLE"); + + @NotNull @Override + public Collection getVariants(ConvertContext context) { + return TYPES; + } + +} diff --git a/src/com/seventh7/mybatis/dom/converter/TrueOrFalseConverter.java b/src/com/seventh7/mybatis/dom/converter/TrueOrFalseConverter.java new file mode 100644 index 0000000..74f74d6 --- /dev/null +++ b/src/com/seventh7/mybatis/dom/converter/TrueOrFalseConverter.java @@ -0,0 +1,23 @@ +package com.seventh7.mybatis.dom.converter; + +import com.google.common.collect.ImmutableSet; + +import com.intellij.util.xml.ConvertContext; + +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; +import java.util.Set; + +/** + * @author yanglin + */ +public class TrueOrFalseConverter extends PlainTextConverter { + + private static final Set RESULTS = ImmutableSet.of("true", "false"); + + @NotNull @Override + public Collection getVariants(ConvertContext context) { + return RESULTS; + } +} diff --git a/src/com/seventh7/mybatis/dom/model/Arg.java b/src/com/seventh7/mybatis/dom/model/Arg.java index 9b26a94..456af38 100644 --- a/src/com/seventh7/mybatis/dom/model/Arg.java +++ b/src/com/seventh7/mybatis/dom/model/Arg.java @@ -1,10 +1,8 @@ package com.seventh7.mybatis.dom.model; -import com.intellij.util.xml.DomElement; - /** * @author yanglin */ -public interface Arg extends DomElement { +public interface Arg extends ReferenceToSelectGroup, JavaTypeGroup, JdbcGroup, ResultMapGroup { } diff --git a/src/com/seventh7/mybatis/dom/model/Association.java b/src/com/seventh7/mybatis/dom/model/Association.java index 3e7bba1..861b87d 100644 --- a/src/com/seventh7/mybatis/dom/model/Association.java +++ b/src/com/seventh7/mybatis/dom/model/Association.java @@ -1,20 +1,8 @@ package com.seventh7.mybatis.dom.model; -import com.intellij.psi.PsiClass; -import com.intellij.util.xml.Attribute; -import com.intellij.util.xml.Convert; -import com.intellij.util.xml.GenericAttributeValue; -import com.seventh7.mybatis.dom.converter.AliasConverter; - -import org.jetbrains.annotations.NotNull; - /** * @author yanglin */ -public interface Association extends GroupFour, ResultMapGroup, PropertyGroup { +public interface Association extends GroupFour, ResultMapGroup, PropertyGroup, ReferenceToSelectGroup, JavaTypeGroup { - @NotNull - @Attribute("javaType") - @Convert(AliasConverter.class) - public GenericAttributeValue getJavaType(); } diff --git a/src/com/seventh7/mybatis/dom/model/Bean.java b/src/com/seventh7/mybatis/dom/model/Bean.java index 3e79ef6..91c6e07 100644 --- a/src/com/seventh7/mybatis/dom/model/Bean.java +++ b/src/com/seventh7/mybatis/dom/model/Bean.java @@ -1,6 +1,5 @@ package com.seventh7.mybatis.dom.model; -import com.intellij.util.xml.DomElement; import com.intellij.util.xml.SubTagList; import org.jetbrains.annotations.NotNull; @@ -10,7 +9,7 @@ /** * @author yanglin */ -public interface Bean extends DomElement { +public interface Bean extends MyBatisElement { @NotNull @SubTagList("property") diff --git a/src/com/seventh7/mybatis/dom/model/BeanProperty.java b/src/com/seventh7/mybatis/dom/model/BeanProperty.java index 3b29938..98a8b75 100644 --- a/src/com/seventh7/mybatis/dom/model/BeanProperty.java +++ b/src/com/seventh7/mybatis/dom/model/BeanProperty.java @@ -1,7 +1,6 @@ package com.seventh7.mybatis.dom.model; import com.intellij.util.xml.Attribute; -import com.intellij.util.xml.DomElement; import com.intellij.util.xml.GenericAttributeValue; import org.jetbrains.annotations.NotNull; @@ -9,7 +8,7 @@ /** * @author yanglin */ -public interface BeanProperty extends DomElement { +public interface BeanProperty extends MyBatisElement { @NotNull @Attribute("name") diff --git a/src/com/seventh7/mybatis/dom/model/Beans.java b/src/com/seventh7/mybatis/dom/model/Beans.java index 135f250..395cc1f 100644 --- a/src/com/seventh7/mybatis/dom/model/Beans.java +++ b/src/com/seventh7/mybatis/dom/model/Beans.java @@ -1,6 +1,5 @@ package com.seventh7.mybatis.dom.model; -import com.intellij.util.xml.DomElement; import com.intellij.util.xml.SubTagList; import org.jetbrains.annotations.NotNull; @@ -10,7 +9,7 @@ /** * @author yanglin */ -public interface Beans extends DomElement { +public interface Beans extends MyBatisElement { @NotNull @SubTagList("bean") diff --git a/src/com/seventh7/mybatis/dom/model/Bind.java b/src/com/seventh7/mybatis/dom/model/Bind.java index 8f75a8d..5078a7a 100644 --- a/src/com/seventh7/mybatis/dom/model/Bind.java +++ b/src/com/seventh7/mybatis/dom/model/Bind.java @@ -1,10 +1,8 @@ package com.seventh7.mybatis.dom.model; -import com.intellij.util.xml.DomElement; - /** * @author yanglin */ -public interface Bind extends DomElement { +public interface Bind extends MyBatisElement { } diff --git a/src/com/seventh7/mybatis/dom/model/Cache.java b/src/com/seventh7/mybatis/dom/model/Cache.java index bf687b0..8bb0fb8 100644 --- a/src/com/seventh7/mybatis/dom/model/Cache.java +++ b/src/com/seventh7/mybatis/dom/model/Cache.java @@ -1,16 +1,46 @@ package com.seventh7.mybatis.dom.model; -import com.intellij.util.xml.DomElement; +import com.google.common.collect.ImmutableSet; + +import com.intellij.util.xml.Attribute; +import com.intellij.util.xml.Convert; +import com.intellij.util.xml.ConvertContext; +import com.intellij.util.xml.GenericAttributeValue; import com.intellij.util.xml.SubTagList; +import com.seventh7.mybatis.dom.converter.PlainTextConverter; +import com.seventh7.mybatis.dom.converter.TrueOrFalseConverter; + +import org.jetbrains.annotations.NotNull; import java.util.List; /** * @author yanglin */ -public interface Cache extends DomElement { +public interface Cache extends MyBatisElement { @SubTagList("property") public List getProperties(); + @NotNull + @Attribute("eviction") + @Convert(CacheEvictionConverter.class) + public GenericAttributeValue getEviction(); + + @NotNull + @Attribute("readOnly") + @Convert(TrueOrFalseConverter.class) + public GenericAttributeValue getReadOnly(); + + public static class CacheEvictionConverter extends PlainTextConverter{ + + private static final java.util.Set EVICTIONS = ImmutableSet.of("LRU", "FIFO", "SOFT", "WEAK"); + + @NotNull @Override + public java.util.Collection getVariants(ConvertContext context) { + return EVICTIONS; + } + + } + } diff --git a/src/com/seventh7/mybatis/dom/model/CacheRef.java b/src/com/seventh7/mybatis/dom/model/CacheRef.java index 1a4d5c3..e37bd1f 100644 --- a/src/com/seventh7/mybatis/dom/model/CacheRef.java +++ b/src/com/seventh7/mybatis/dom/model/CacheRef.java @@ -1,10 +1,21 @@ package com.seventh7.mybatis.dom.model; -import com.intellij.util.xml.DomElement; +import com.intellij.psi.PsiClass; +import com.intellij.util.xml.Attribute; +import com.intellij.util.xml.Convert; +import com.intellij.util.xml.GenericAttributeValue; +import com.seventh7.mybatis.dom.converter.CacheRefNamespaceConverter; + +import org.jetbrains.annotations.NotNull; /** * @author yanglin */ -public interface CacheRef extends DomElement { +public interface CacheRef extends MyBatisElement { + + @NotNull + @Attribute("namespace") + @Convert(CacheRefNamespaceConverter.class) + public GenericAttributeValue getNamespace(); } diff --git a/src/com/seventh7/mybatis/dom/model/Case.java b/src/com/seventh7/mybatis/dom/model/Case.java index eb1e61f..7654015 100644 --- a/src/com/seventh7/mybatis/dom/model/Case.java +++ b/src/com/seventh7/mybatis/dom/model/Case.java @@ -1,8 +1,21 @@ package com.seventh7.mybatis.dom.model; +import com.intellij.psi.xml.XmlAttributeValue; +import com.intellij.util.xml.Attribute; +import com.intellij.util.xml.Convert; +import com.intellij.util.xml.GenericAttributeValue; +import com.seventh7.mybatis.dom.converter.ResultMapConverter; + +import org.jetbrains.annotations.NotNull; + /** * @author yanglin */ -public interface Case extends GroupFour{ +public interface Case extends GroupFour, ResultTypeGroup{ + + @NotNull + @Attribute("resultMap") + @Convert(ResultMapConverter.class) + public GenericAttributeValue getResultMap(); } diff --git a/src/com/seventh7/mybatis/dom/model/Choose.java b/src/com/seventh7/mybatis/dom/model/Choose.java index d221ee2..81ac934 100644 --- a/src/com/seventh7/mybatis/dom/model/Choose.java +++ b/src/com/seventh7/mybatis/dom/model/Choose.java @@ -1,6 +1,5 @@ package com.seventh7.mybatis.dom.model; -import com.intellij.util.xml.DomElement; import com.intellij.util.xml.Required; import com.intellij.util.xml.SubTag; import com.intellij.util.xml.SubTagList; @@ -12,7 +11,7 @@ /** * @author yanglin */ -public interface Choose extends DomElement { +public interface Choose extends MyBatisElement { @NotNull @Required diff --git a/src/com/seventh7/mybatis/dom/model/Collection.java b/src/com/seventh7/mybatis/dom/model/Collection.java index a557fa4..3a67158 100644 --- a/src/com/seventh7/mybatis/dom/model/Collection.java +++ b/src/com/seventh7/mybatis/dom/model/Collection.java @@ -11,7 +11,7 @@ /** * @author yanglin */ -public interface Collection extends GroupFour, ResultMapGroup, PropertyGroup { +public interface Collection extends Association { @NotNull @Attribute("ofType") diff --git a/src/com/seventh7/mybatis/dom/model/Configuration.java b/src/com/seventh7/mybatis/dom/model/Configuration.java index 1cd4d7a..bf6259a 100644 --- a/src/com/seventh7/mybatis/dom/model/Configuration.java +++ b/src/com/seventh7/mybatis/dom/model/Configuration.java @@ -1,6 +1,5 @@ package com.seventh7.mybatis.dom.model; -import com.intellij.util.xml.DomElement; import com.intellij.util.xml.SubTagList; import org.jetbrains.annotations.NotNull; @@ -10,7 +9,7 @@ /** * @author yanglin */ -public interface Configuration extends DomElement { +public interface Configuration extends MyBatisElement { @NotNull @SubTagList("typeAliases") diff --git a/src/com/seventh7/mybatis/dom/model/Constructor.java b/src/com/seventh7/mybatis/dom/model/Constructor.java index b7274eb..a749238 100644 --- a/src/com/seventh7/mybatis/dom/model/Constructor.java +++ b/src/com/seventh7/mybatis/dom/model/Constructor.java @@ -1,6 +1,5 @@ package com.seventh7.mybatis.dom.model; -import com.intellij.util.xml.DomElement; import com.intellij.util.xml.SubTagList; import java.util.List; @@ -8,7 +7,7 @@ /** * @author yanglin */ -public interface Constructor extends DomElement { +public interface Constructor extends MyBatisElement { @SubTagList("arg") public List getArgs(); diff --git a/src/com/seventh7/mybatis/dom/model/Discriminator.java b/src/com/seventh7/mybatis/dom/model/Discriminator.java index cd7b1a3..71c4441 100644 --- a/src/com/seventh7/mybatis/dom/model/Discriminator.java +++ b/src/com/seventh7/mybatis/dom/model/Discriminator.java @@ -1,6 +1,5 @@ package com.seventh7.mybatis.dom.model; -import com.intellij.util.xml.DomElement; import com.intellij.util.xml.Required; import com.intellij.util.xml.SubTagList; @@ -9,7 +8,7 @@ /** * @author yanglin */ -public interface Discriminator extends DomElement { +public interface Discriminator extends JavaTypeGroup, JdbcGroup { @Required @SubTagList("case") diff --git a/src/com/seventh7/mybatis/dom/model/Foreach.java b/src/com/seventh7/mybatis/dom/model/Foreach.java index 564c974..b6d1124 100644 --- a/src/com/seventh7/mybatis/dom/model/Foreach.java +++ b/src/com/seventh7/mybatis/dom/model/Foreach.java @@ -1,8 +1,34 @@ package com.seventh7.mybatis.dom.model; +import com.google.common.collect.ImmutableSet; + +import com.intellij.util.xml.Attribute; +import com.intellij.util.xml.Convert; +import com.intellij.util.xml.ConvertContext; +import com.intellij.util.xml.GenericAttributeValue; +import com.seventh7.mybatis.dom.converter.PlainTextConverter; + +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; + /** * @author yanglin */ public interface Foreach extends GroupOne { + @NotNull + @Attribute("collection") + @Convert(ForEachCollectionConverter.class) + public GenericAttributeValue getCollection(); + + public static class ForEachCollectionConverter extends PlainTextConverter { + + private static final java.util.Set TYPES_KNOWN = ImmutableSet.of("list", "array"); + + @NotNull @Override + public Collection getVariants(ConvertContext context) { + return TYPES_KNOWN; + } + } } diff --git a/src/com/seventh7/mybatis/dom/model/GroupFour.java b/src/com/seventh7/mybatis/dom/model/GroupFour.java index 8a7cd65..327e810 100644 --- a/src/com/seventh7/mybatis/dom/model/GroupFour.java +++ b/src/com/seventh7/mybatis/dom/model/GroupFour.java @@ -1,7 +1,5 @@ package com.seventh7.mybatis.dom.model; -import com.intellij.util.xml.DomElement; -import com.intellij.util.xml.SubTag; import com.intellij.util.xml.SubTagList; import java.util.List; @@ -9,9 +7,9 @@ /** * @author yanglin */ -public interface GroupFour extends DomElement { +public interface GroupFour extends MyBatisElement { - @SubTag("constructor") + @SubTagList("constructor") public Constructor getConstructor(); @SubTagList("id") @@ -26,6 +24,12 @@ public interface GroupFour extends DomElement { @SubTagList("collection") public List getCollections(); - @SubTag("discriminator") + @SubTagList("discriminator") public Discriminator getDiscriminator(); + + @SubTagList("id") + public Id addId(); + + @SubTagList("result") + public Result addResult(); } diff --git a/src/com/seventh7/mybatis/dom/model/GroupOne.java b/src/com/seventh7/mybatis/dom/model/GroupOne.java index 6272dae..96d79e9 100644 --- a/src/com/seventh7/mybatis/dom/model/GroupOne.java +++ b/src/com/seventh7/mybatis/dom/model/GroupOne.java @@ -1,6 +1,5 @@ package com.seventh7.mybatis.dom.model; -import com.intellij.util.xml.DomElement; import com.intellij.util.xml.SubTagList; import org.jetbrains.annotations.NotNull; @@ -10,7 +9,7 @@ /** * @author yanglin */ -public interface GroupOne extends DomElement{ +public interface GroupOne extends MyBatisElement{ @NotNull @SubTagList("include") diff --git a/src/com/seventh7/mybatis/dom/model/GroupTwo.java b/src/com/seventh7/mybatis/dom/model/GroupTwo.java index e971f64..0a00df2 100644 --- a/src/com/seventh7/mybatis/dom/model/GroupTwo.java +++ b/src/com/seventh7/mybatis/dom/model/GroupTwo.java @@ -5,7 +5,6 @@ import com.intellij.util.xml.Attribute; import com.intellij.util.xml.Convert; import com.intellij.util.xml.GenericAttributeValue; -import com.intellij.util.xml.Required; import com.intellij.util.xml.SubTagList; import com.seventh7.mybatis.dom.converter.AliasConverter; import com.seventh7.mybatis.dom.converter.DaoMethodConverter; @@ -18,7 +17,7 @@ /** * @author yanglin */ -public interface GroupTwo extends GroupOne, IdDomElement{ +public interface GroupTwo extends GroupOne, IdDomElement, LangGroup{ @SubTagList("bind") public List getBinds(); @@ -36,4 +35,5 @@ public interface GroupTwo extends GroupOne, IdDomElement{ @Attribute("parameterType") @Convert(AliasConverter.class) public GenericAttributeValue getParameterType(); + } diff --git a/src/com/seventh7/mybatis/dom/model/IdArg.java b/src/com/seventh7/mybatis/dom/model/IdArg.java index c263064..a2344c8 100644 --- a/src/com/seventh7/mybatis/dom/model/IdArg.java +++ b/src/com/seventh7/mybatis/dom/model/IdArg.java @@ -1,10 +1,8 @@ package com.seventh7.mybatis.dom.model; -import com.intellij.util.xml.DomElement; - /** * @author yanglin */ -public interface IdArg extends DomElement { +public interface IdArg extends Arg { } diff --git a/src/com/seventh7/mybatis/dom/model/IdDomElement.java b/src/com/seventh7/mybatis/dom/model/IdDomElement.java index 062e845..0970357 100644 --- a/src/com/seventh7/mybatis/dom/model/IdDomElement.java +++ b/src/com/seventh7/mybatis/dom/model/IdDomElement.java @@ -1,7 +1,6 @@ package com.seventh7.mybatis.dom.model; import com.intellij.util.xml.Attribute; -import com.intellij.util.xml.DomElement; import com.intellij.util.xml.GenericAttributeValue; import com.intellij.util.xml.NameValue; import com.intellij.util.xml.Required; @@ -9,7 +8,7 @@ /** * @author yanglin */ -public interface IdDomElement extends DomElement{ +public interface IdDomElement extends MyBatisElement{ @Required @NameValue diff --git a/src/com/seventh7/mybatis/dom/model/Include.java b/src/com/seventh7/mybatis/dom/model/Include.java index 9c29a21..31d0f22 100644 --- a/src/com/seventh7/mybatis/dom/model/Include.java +++ b/src/com/seventh7/mybatis/dom/model/Include.java @@ -3,14 +3,13 @@ import com.intellij.psi.xml.XmlTag; import com.intellij.util.xml.Attribute; import com.intellij.util.xml.Convert; -import com.intellij.util.xml.DomElement; import com.intellij.util.xml.GenericAttributeValue; import com.seventh7.mybatis.dom.converter.SqlConverter; /** * @author yanglin */ -public interface Include extends DomElement { +public interface Include extends MyBatisElement { @Attribute("refid") @Convert(SqlConverter.class) diff --git a/src/com/seventh7/mybatis/dom/model/JavaTypeGroup.java b/src/com/seventh7/mybatis/dom/model/JavaTypeGroup.java new file mode 100644 index 0000000..ee54437 --- /dev/null +++ b/src/com/seventh7/mybatis/dom/model/JavaTypeGroup.java @@ -0,0 +1,21 @@ +package com.seventh7.mybatis.dom.model; + +import com.intellij.psi.PsiClass; +import com.intellij.util.xml.Attribute; +import com.intellij.util.xml.Convert; +import com.intellij.util.xml.GenericAttributeValue; +import com.seventh7.mybatis.dom.converter.AliasConverter; + +import org.jetbrains.annotations.NotNull; + +/** + * @author yanglin + */ +public interface JavaTypeGroup extends MyBatisElement { + + @NotNull + @Attribute("javaType") + @Convert(AliasConverter.class) + public GenericAttributeValue getJavaType(); + +} diff --git a/src/com/seventh7/mybatis/dom/model/JdbcGroup.java b/src/com/seventh7/mybatis/dom/model/JdbcGroup.java new file mode 100644 index 0000000..2f711d2 --- /dev/null +++ b/src/com/seventh7/mybatis/dom/model/JdbcGroup.java @@ -0,0 +1,20 @@ +package com.seventh7.mybatis.dom.model; + +import com.intellij.util.xml.Attribute; +import com.intellij.util.xml.Convert; +import com.intellij.util.xml.GenericAttributeValue; +import com.seventh7.mybatis.dom.converter.JdbcTypeConverter; + +import org.jetbrains.annotations.NotNull; + +/** + * @author yanglin + */ +public interface JdbcGroup extends MyBatisElement { + + @NotNull + @Attribute("jdbcType") + @Convert(JdbcTypeConverter.class) + public GenericAttributeValue getJdbcType(); + +} diff --git a/src/com/seventh7/mybatis/dom/model/LangGroup.java b/src/com/seventh7/mybatis/dom/model/LangGroup.java new file mode 100644 index 0000000..ad9e90d --- /dev/null +++ b/src/com/seventh7/mybatis/dom/model/LangGroup.java @@ -0,0 +1,35 @@ +package com.seventh7.mybatis.dom.model; + +import com.google.common.collect.ImmutableSet; + +import com.intellij.util.xml.Attribute; +import com.intellij.util.xml.Convert; +import com.intellij.util.xml.ConvertContext; +import com.intellij.util.xml.GenericAttributeValue; +import com.seventh7.mybatis.dom.converter.PlainTextConverter; + +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; + +/** + * @author yanglin + */ +public interface LangGroup extends MyBatisElement { + + @NotNull + @Attribute("lang") + @Convert(LangConverter.class) + public GenericAttributeValue getLang(); + + public static class LangConverter extends PlainTextConverter { + + private static final java.util.Set RAW_KNOWN = ImmutableSet.of("xml", "raw"); + + @NotNull @Override + public Collection getVariants(ConvertContext context) { + return RAW_KNOWN; + } + + } +} diff --git a/src/com/seventh7/mybatis/dom/model/Mapper.java b/src/com/seventh7/mybatis/dom/model/Mapper.java index e1a3e10..ef1c911 100644 --- a/src/com/seventh7/mybatis/dom/model/Mapper.java +++ b/src/com/seventh7/mybatis/dom/model/Mapper.java @@ -1,7 +1,6 @@ package com.seventh7.mybatis.dom.model; import com.intellij.util.xml.Attribute; -import com.intellij.util.xml.DomElement; import com.intellij.util.xml.GenericAttributeValue; import com.intellij.util.xml.NameValue; import com.intellij.util.xml.Required; @@ -15,7 +14,7 @@ /** * @author yanglin */ -public interface Mapper extends DomElement { +public interface Mapper extends MyBatisElement { @NotNull @SubTagsList({"insert", "update", "delete", "select"}) @@ -55,6 +54,14 @@ public interface Mapper extends DomElement { @SubTagList("select") public List