diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenArtifactCoordinatesConverter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenArtifactCoordinatesConverter.java index 7752ddef27af..34eb8e1aec71 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenArtifactCoordinatesConverter.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenArtifactCoordinatesConverter.java @@ -26,6 +26,7 @@ import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; import com.intellij.util.ArrayUtil; import com.intellij.util.xml.ConvertContext; +import com.intellij.util.xml.DomUtil; import com.intellij.util.xml.ResolvingConverter; import gnu.trove.THashSet; import org.jetbrains.annotations.NonNls; @@ -64,7 +65,10 @@ public abstract class MavenArtifactCoordinatesConverter extends ResolvingConvert public Collection getVariants(ConvertContext context) { MavenProjectIndicesManager manager = MavenProjectIndicesManager.getInstance(getProject(context)); MavenId id = MavenArtifactCoordinatesHelper.getId(context); - return selectStrategy(context).getVariants(id, manager); + + MavenDomShortArtifactCoordinates coordinates = MavenArtifactCoordinatesHelper.getCoordinates(context); + + return selectStrategy(context).getVariants(id, manager, coordinates); } protected abstract Set doGetVariants(MavenId id, MavenProjectIndicesManager manager); @@ -147,7 +151,7 @@ public abstract class MavenArtifactCoordinatesConverter extends ResolvingConvert return doIsValid(id, manager, context) || resolveBySpecifiedPath() != null; } - public Set getVariants(MavenId id, MavenProjectIndicesManager manager) { + public Set getVariants(MavenId id, MavenProjectIndicesManager manager, MavenDomShortArtifactCoordinates coordinates) { return doGetVariants(id, manager); } @@ -240,6 +244,20 @@ public abstract class MavenArtifactCoordinatesConverter extends ResolvingConvert public PsiFile resolveBySpecifiedPath() { return myDependency.getSystemPath().getValue(); } + + @Override + public Set getVariants(MavenId id, MavenProjectIndicesManager manager, MavenDomShortArtifactCoordinates coordinates) { + if (StringUtil.isEmpty(id.getGroupId())) { + Set result = new THashSet(); + if (DomUtil.hasXml(coordinates.getGroupId())) { + for (String each : manager.getGroupIds()) { + id = new MavenId(each, id.getArtifactId(), id.getVersion()); + result.addAll(super.getVariants(id, manager, coordinates)); + } } + return result; + } + return super.getVariants(id, manager, coordinates); + } } private class ExclusionStrategy extends ConverterStrategy { @@ -278,16 +296,25 @@ public abstract class MavenArtifactCoordinatesConverter extends ResolvingConvert } @Override - public Set getVariants(MavenId id, MavenProjectIndicesManager manager) { + public Set getVariants(MavenId id, MavenProjectIndicesManager manager, MavenDomShortArtifactCoordinates coordinates) { if (StringUtil.isEmpty(id.getGroupId())) { Set result = new THashSet(); - for (String each : MavenArtifactUtil.DEFAULT_GROUPS) { + + for (String each : getGroupIdVariants(manager, coordinates)) { id = new MavenId(each, id.getArtifactId(), id.getVersion()); - result.addAll(super.getVariants(id, manager)); + result.addAll(super.getVariants(id, manager, coordinates)); } return result; } - return super.getVariants(id, manager); + return super.getVariants(id, manager, coordinates); + } + + private String[] getGroupIdVariants(MavenProjectIndicesManager manager, MavenDomShortArtifactCoordinates coordinates) { + if (DomUtil.hasXml(coordinates.getGroupId())) { + Set strings = manager.getGroupIds(); + return strings.toArray(new String[strings.size()]); + } + return MavenArtifactUtil.DEFAULT_GROUPS; } @Override diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenArtifactCoordinatesGroupIdConverter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenArtifactCoordinatesGroupIdConverter.java index 114813f2a2f9..ada8abd01195 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenArtifactCoordinatesGroupIdConverter.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenArtifactCoordinatesGroupIdConverter.java @@ -1,25 +1,15 @@ -/* - * Copyright 2000-2009 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ package org.jetbrains.idea.maven.dom.converters; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.util.containers.hash.HashSet; import com.intellij.util.xml.ConvertContext; +import com.intellij.util.xml.impl.ConvertContextImpl; +import org.jetbrains.idea.maven.dom.model.MavenDomShortArtifactCoordinates; import org.jetbrains.idea.maven.indices.MavenProjectIndicesManager; import org.jetbrains.idea.maven.project.MavenId; +import java.util.Collection; +import java.util.Collections; import java.util.Set; public class MavenArtifactCoordinatesGroupIdConverter extends MavenArtifactCoordinatesConverter { @@ -33,4 +23,18 @@ public class MavenArtifactCoordinatesGroupIdConverter extends MavenArtifactCoord protected Set doGetVariants(MavenId id, MavenProjectIndicesManager manager) { return manager.getGroupIds(); } + + public Collection getSmartVariants(ConvertContext convertContext) { + Set groupIds = new HashSet(); + String artifactId = MavenArtifactCoordinatesHelper.getId(convertContext).getArtifactId(); + if (!StringUtil.isEmptyOrSpaces(artifactId)) { + MavenProjectIndicesManager manager = MavenProjectIndicesManager.getInstance(convertContext.getFile().getProject()); + for (String grouipId : manager.getGroupIds()) { + if (manager.getArtifactIds(grouipId).contains(artifactId)) { + groupIds.add(grouipId); + } + } + } + return groupIds; + } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenArtifactCoordinatesHelper.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenArtifactCoordinatesHelper.java index 6583f75850a3..7429a956ad35 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenArtifactCoordinatesHelper.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/MavenArtifactCoordinatesHelper.java @@ -16,14 +16,19 @@ package org.jetbrains.idea.maven.dom.converters; import com.intellij.util.xml.ConvertContext; +import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.maven.dom.model.MavenDomArtifactCoordinates; import org.jetbrains.idea.maven.dom.model.MavenDomShortArtifactCoordinates; import org.jetbrains.idea.maven.project.MavenId; public class MavenArtifactCoordinatesHelper { public static MavenId getId(ConvertContext context) { - MavenDomShortArtifactCoordinates coords = (MavenDomShortArtifactCoordinates)context.getInvocationElement().getParent(); - return getId(coords); + return getId(getCoordinates(context)); + } + + @Nullable + public static MavenDomShortArtifactCoordinates getCoordinates(ConvertContext context) { + return (MavenDomShortArtifactCoordinates)context.getInvocationElement().getParent(); } public static MavenId getId(MavenDomShortArtifactCoordinates coords) { diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/repositories/MavenRepositoriesProvider.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/repositories/MavenRepositoriesProvider.java new file mode 100644 index 000000000000..65d29ae07e44 --- /dev/null +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/repositories/MavenRepositoriesProvider.java @@ -0,0 +1,75 @@ +/* + * Copyright 2000-2010 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.idea.maven.dom.converters.repositories; + +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.components.ServiceManager; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Pair; +import com.intellij.util.containers.HashMap; +import com.intellij.util.xmlb.XmlSerializer; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.idea.maven.dom.converters.repositories.beans.RepositoriesBean; +import org.jetbrains.idea.maven.dom.converters.repositories.beans.RepositoryBeanInfo; + +import java.util.Map; +import java.util.Set; + +/** + * @author Serega.Vasiliev + */ +public class MavenRepositoriesProvider { + public static MavenRepositoriesProvider getInstance() { + return ServiceManager.getService(MavenRepositoriesProvider.class); + } + + Map> myRepositoriesMap = new HashMap>(); + + public MavenRepositoriesProvider() { + final RepositoriesBean repositoriesBean = + XmlSerializer.deserialize(MavenRepositoriesProvider.class.getResource("repositories.xml"), RepositoriesBean.class); + + assert repositoriesBean != null; + RepositoryBeanInfo[] repositories = repositoriesBean.getRepositories(); + assert repositories != null; + + for (RepositoryBeanInfo repository : repositories) { + registerRepository(repository.getId(), repository.getName(), repository.getUrl()); + } + } + + public void registerRepository(@NotNull String id, @NotNull String name, @NotNull String url) { + myRepositoriesMap.put(id, Pair.create(name, url)); + } + + @NotNull + public Set getRepositoryIds() { + return myRepositoriesMap.keySet(); + } + + @Nullable + public String getRepositoryName(@Nullable String id) { + Pair pair = myRepositoriesMap.get(id); + return pair != null ? pair.getFirst() : null; + } + + @Nullable + public String getRepositoryUrl(@Nullable String id) { + Pair pair = myRepositoriesMap.get(id); + return pair != null ? pair.getSecond() : null; + } +} diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/repositories/MavenRepositoryConverter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/repositories/MavenRepositoryConverter.java new file mode 100644 index 000000000000..1d1b4df18c1f --- /dev/null +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/repositories/MavenRepositoryConverter.java @@ -0,0 +1,119 @@ +/* + * Copyright 2000-2010 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.idea.maven.dom.converters.repositories; + +import com.intellij.codeInsight.lookup.LookupElement; +import com.intellij.codeInsight.lookup.LookupElementFactory; +import com.intellij.codeInsight.lookup.MutableLookupElement; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.util.TextRange; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.psi.ElementManipulators; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiReference; +import com.intellij.util.xml.ConvertContext; +import com.intellij.util.xml.GenericDomValue; +import com.intellij.util.xml.ResolvingConverter; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.idea.maven.dom.converters.MavenUrlConverter; +import org.jetbrains.idea.maven.dom.model.MavenDomRepositoryBase; +import org.jetbrains.idea.maven.dom.references.MavenUrlPsiReference; +import org.jetbrains.idea.maven.utils.MavenIcons; + +import java.util.Collection; +import java.util.Collections; + +/** + * @author Serega.Vasiliev + */ +public abstract class MavenRepositoryConverter extends ResolvingConverter { + + public static class Id extends MavenRepositoryConverter { + @NotNull + public Collection getVariants(final ConvertContext context) { + Module module = context.getModule(); + if (module != null) { + return MavenRepositoriesProvider.getInstance().getRepositoryIds(); + } + return Collections.emptySet(); + } + + @Override + public LookupElement createLookupElement(String s) { + MutableLookupElement element = LookupElementFactory.getInstance().createLookupElement(s, s) + .setIcon(MavenIcons.REPOSITORY_ICON) + .setTailText(" (" + MavenRepositoriesProvider.getInstance().getRepositoryUrl(s) + ")", true); + + return element; + } + } + + public static class Name extends MavenRepositoryConverter { + @NotNull + public Collection getVariants(final ConvertContext context) { + Module module = context.getModule(); + + if (module != null) { + String name = MavenRepositoriesProvider.getInstance().getRepositoryName(getRepositoryId(context)); + if (!StringUtil.isEmptyOrSpaces(name)) return Collections.singleton(name); + } + return Collections.emptySet(); + } + } + + public static class Url extends MavenUrlConverter { + + @NotNull + @Override + public PsiReference[] createReferences(GenericDomValue value, final PsiElement element, final ConvertContext context) { + String text = value.getStringValue(); + TextRange range = ElementManipulators.getValueTextRange(element); + return new PsiReference[]{new MavenUrlPsiReference(element, text, range) { + + @NotNull + @Override + public Object[] getVariants() { + Module module = context.getModule(); + + if (module != null) { + String name = MavenRepositoriesProvider.getInstance().getRepositoryUrl(getRepositoryId(context)); + if (!StringUtil.isEmptyOrSpaces(name)) return new Object[]{name}; + } + return super.getVariants(); + } + }}; + } + } + + @Nullable + private static String getRepositoryId(ConvertContext context) { + MavenDomRepositoryBase repository = context.getInvocationElement().getParentOfType(MavenDomRepositoryBase.class, false); + if (repository != null) return repository.getId().getStringValue(); + + return null; + } + + public String fromString(@Nullable @NonNls final String s, final ConvertContext context) { + return s; + } + + @Override + public String toString(@Nullable String s, ConvertContext convertContext) { + return s; + } +} \ No newline at end of file diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/repositories/beans/RepositoriesBean.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/repositories/beans/RepositoriesBean.java new file mode 100644 index 000000000000..8b1389dc60f4 --- /dev/null +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/repositories/beans/RepositoriesBean.java @@ -0,0 +1,30 @@ +/* + * Copyright 2000-2010 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.idea.maven.dom.converters.repositories.beans; + +import com.intellij.util.xmlb.annotations.AbstractCollection; +import com.intellij.util.xmlb.annotations.Tag; + +public class RepositoriesBean { + @Tag("repositories") + @AbstractCollection(surroundWithTag = false) + public RepositoryBeanInfo[] myRepositories; + + public RepositoryBeanInfo[] getRepositories() { + return myRepositories; + } +} \ No newline at end of file diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/repositories/beans/RepositoryBeanInfo.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/repositories/beans/RepositoryBeanInfo.java new file mode 100644 index 000000000000..96f918b3e937 --- /dev/null +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/repositories/beans/RepositoryBeanInfo.java @@ -0,0 +1,46 @@ +/* + * Copyright 2000-2010 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.idea.maven.dom.converters.repositories.beans; + +import com.intellij.util.xmlb.annotations.Attribute; +import com.intellij.util.xmlb.annotations.Tag; + +/** + * @author Serega.Vasiliev + */ +@Tag("repository") +public class RepositoryBeanInfo { + @Attribute("id") + public String myId; + + @Attribute("name") + public String myName; + + @Attribute("url") + public String myUrl; + + public String getId() { + return myId; + } + + public String getName() { + return myName; + } + + public String getUrl() { + return myUrl; + } +} diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/repositories/repositories.xml b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/repositories/repositories.xml new file mode 100644 index 000000000000..672695643cc4 --- /dev/null +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/converters/repositories/repositories.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/generate/MavenCodeInsightGenerateAction.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/generate/MavenCodeInsightGenerateAction.java new file mode 100644 index 000000000000..26c7aaf787d4 --- /dev/null +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/generate/MavenCodeInsightGenerateAction.java @@ -0,0 +1,46 @@ +package org.jetbrains.idea.maven.dom.generate; + +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.intellij.psi.xml.XmlFile; +import com.intellij.util.Function; +import com.intellij.util.xml.DomElement; +import com.intellij.util.xml.ElementPresentationManager; +import com.intellij.util.xml.TypeNameManager; +import com.intellij.util.xml.ui.actions.generate.GenerateDomElementAction; +import com.intellij.util.xml.ui.actions.generate.GenerateDomElementProvider; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.idea.maven.dom.MavenDomUtil; +import org.jetbrains.idea.maven.dom.model.MavenDomProjectModel; + +/** + * User: Sergey.Vasiliev + */ +public class MavenCodeInsightGenerateAction extends GenerateDomElementAction { + + public MavenCodeInsightGenerateAction(@NotNull Class childElementClass, + @Nullable final String mappingId, + @NotNull Function parentFunction) { + this(TypeNameManager.getTypeName(childElementClass), childElementClass, mappingId, parentFunction); + } + + public MavenCodeInsightGenerateAction(@NotNull final String description, + @NotNull final Class childElementClass, + @Nullable final String mappingId, + @NotNull Function parentFunction) { + super(new MavenGenerateDomElementProvider(description, childElementClass, mappingId, parentFunction)); + + getTemplatePresentation().setIcon(ElementPresentationManager.getIconForClass(childElementClass)); + } + + public MavenCodeInsightGenerateAction(final GenerateDomElementProvider generateProvider) { + super(generateProvider); + } + + protected boolean isValidForFile(Project project, Editor editor, PsiFile file) { + return file instanceof XmlFile && MavenDomUtil.getMavenDomModel(file, MavenDomProjectModel.class) != null; + } + +} \ No newline at end of file diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/generate/MavenGenerateDomActionGroup.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/generate/MavenGenerateDomActionGroup.java new file mode 100644 index 000000000000..276caebce46d --- /dev/null +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/generate/MavenGenerateDomActionGroup.java @@ -0,0 +1,75 @@ +/* + * Copyright 2000-2010 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.idea.maven.dom.generate; + +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.DefaultActionGroup; +import com.intellij.util.Function; +import com.intellij.util.xml.DomElement; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.idea.maven.dom.MavenDomBundle; +import org.jetbrains.idea.maven.dom.model.MavenDomDependency; +import org.jetbrains.idea.maven.dom.model.MavenDomPlugin; +import org.jetbrains.idea.maven.dom.model.MavenDomProjectModel; +import org.jetbrains.idea.maven.dom.model.MavenDomRepository; + +/** + * User: Sergey.Vasiliev + */ +public class MavenGenerateDomActionGroup extends DefaultActionGroup { + + public MavenGenerateDomActionGroup() { + // generate dependencies + final Function dependenciesFunction = new Function() { + public DomElement fun(MavenDomProjectModel mavenDomProjectModel) { + return mavenDomProjectModel.getDependencies(); + } + }; + add(createAction(MavenDomBundle.message("generate.dependency.artifact"), MavenDomDependency.class, "maven-dependency-artifact", dependenciesFunction)); + add(createAction(MavenDomBundle.message("generate.dependency.group"), MavenDomDependency.class, "maven-dependency", dependenciesFunction)); + + // generate plugins + Function pluginFunction = new Function() { + public DomElement fun(MavenDomProjectModel mavenDomProjectModel) { + return mavenDomProjectModel.getBuild().getPlugins(); + } + }; + add(createAction(MavenDomBundle.message("generate.plugin.artifact"), MavenDomPlugin.class, "maven-plugin-artifact-first", pluginFunction)); + add(createAction(MavenDomBundle.message("generate.plugin.group"), MavenDomPlugin.class, "maven-plugin", pluginFunction)); + + // generate repository + add(createAction(MavenDomRepository.class, "maven-repository", new Function() { + public DomElement fun(MavenDomProjectModel mavenDomProjectModel) { + return mavenDomProjectModel.getRepositories(); + } + })); + } + + private static MavenCodeInsightGenerateAction createAction(String actionDescription, + final Class aClass, + @NonNls @Nullable String mappingId, + @NotNull Function parentFunction) { + return new MavenCodeInsightGenerateAction(actionDescription, aClass, mappingId, parentFunction); + } + + protected static AnAction createAction(final Class aClass, + @NonNls @Nullable String mappingId, + @NotNull Function parentFunction) { + return new MavenCodeInsightGenerateAction(aClass, mappingId, parentFunction); + } +} \ No newline at end of file diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/generate/MavenGenerateDomElementProvider.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/generate/MavenGenerateDomElementProvider.java new file mode 100644 index 000000000000..e533722b6e53 --- /dev/null +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/generate/MavenGenerateDomElementProvider.java @@ -0,0 +1,43 @@ +/* + * Copyright 2000-2010 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.idea.maven.dom.generate; + +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.intellij.util.Function; +import com.intellij.util.xml.DomElement; +import com.intellij.util.xml.actions.generate.AbstractDomGenerateProvider; +import org.jetbrains.idea.maven.dom.MavenDomUtil; +import org.jetbrains.idea.maven.dom.model.MavenDomProjectModel; + +/** + * User: Sergey.Vasiliev + */ +public class MavenGenerateDomElementProvider extends AbstractDomGenerateProvider{ + private final Function myParentFunction; + + public MavenGenerateDomElementProvider(final String description, final Class childElementClass, String mappingId, Function parentFunction) { + super(description, childElementClass, mappingId); + myParentFunction = parentFunction; + } + + protected DomElement getParentDomElement(final Project project, final Editor editor, final PsiFile file) { + MavenDomProjectModel domProjectModel = MavenDomUtil.getMavenDomModel(file, MavenDomProjectModel.class); + + return domProjectModel == null ? null : myParentFunction.fun(domProjectModel); + } +} \ No newline at end of file diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/model/MavenDomRepositoryBase.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/model/MavenDomRepositoryBase.java index 1135cd1a675b..c065a190ef77 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/model/MavenDomRepositoryBase.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/model/MavenDomRepositoryBase.java @@ -26,17 +26,20 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.idea.maven.dom.MavenDomElement; import org.jetbrains.idea.maven.dom.converters.MavenRepositoryLayoutConverter; import org.jetbrains.idea.maven.dom.converters.MavenUrlConverter; +import org.jetbrains.idea.maven.dom.converters.repositories.MavenRepositoryConverter; public interface MavenDomRepositoryBase extends MavenDomElement { @NotNull @Required + @Convert(MavenRepositoryConverter.Id.class) GenericDomValue getId(); @NotNull + @Convert(MavenRepositoryConverter.Name.class) GenericDomValue getName(); @NotNull - @Convert(MavenUrlConverter.class) + @Convert(MavenRepositoryConverter.Url.class) GenericDomValue getUrl(); @NotNull diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/model/completion/MavenGroupIdSmartCompletionContributor.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/model/completion/MavenGroupIdSmartCompletionContributor.java new file mode 100644 index 000000000000..1b41749c9c67 --- /dev/null +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/model/completion/MavenGroupIdSmartCompletionContributor.java @@ -0,0 +1,87 @@ +/* + * Copyright 2000-2010 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.idea.maven.dom.model.completion; + +import com.intellij.codeInsight.completion.CompletionContributor; +import com.intellij.codeInsight.completion.CompletionParameters; +import com.intellij.codeInsight.completion.CompletionResultSet; +import com.intellij.codeInsight.completion.CompletionType; +import com.intellij.codeInsight.lookup.LookupElementBuilder; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiReference; +import com.intellij.psi.xml.XmlText; +import com.intellij.psi.xml.XmlToken; +import com.intellij.util.xml.Converter; +import com.intellij.util.xml.impl.GenericDomValueReference; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.idea.maven.dom.converters.MavenArtifactCoordinatesGroupIdConverter; + +import java.util.Collection; + +public class MavenGroupIdSmartCompletionContributor extends CompletionContributor { + + @Override + public void fillCompletionVariants(final CompletionParameters parameters, final CompletionResultSet result) { + + if (parameters.getCompletionType() != CompletionType.SMART) { + return; + } + ApplicationManager.getApplication().runReadAction(new Runnable() { + public void run() { + final GenericDomValueReference reference = getReference(parameters); + if (reference == null) { + return; + } + + Collection variants = + ((MavenArtifactCoordinatesGroupIdConverter)reference.getConverter()).getSmartVariants(reference.getConvertContext()); + + for (String variant : variants) { + if (!StringUtil.isEmptyOrSpaces(variant)) { + result.addElement(LookupElementBuilder.create(variant)); + + } + } + } + }); + } + + @Nullable + private GenericDomValueReference getReference(CompletionParameters parameters) { + + if (!(parameters.getPosition() instanceof XmlToken)) return null; + + PsiReference[] references = getReferences(parameters); + for (final PsiReference psiReference : references) { + if (psiReference instanceof GenericDomValueReference) { + final Converter converter = ((GenericDomValueReference)psiReference).getConverter(); + if (converter instanceof MavenArtifactCoordinatesGroupIdConverter) { + return (GenericDomValueReference)psiReference; + } + } + } + return null; + } + + private static PsiReference[] getReferences(CompletionParameters parameters) { + PsiElement psiElement = parameters.getPosition().getParent(); + + return psiElement instanceof XmlText ? psiElement.getParent().getReferences() : psiElement.getReferences(); + } +} \ No newline at end of file diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenUrlPsiReference.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenUrlPsiReference.java index 62e04c6787f8..12fd29d00798 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenUrlPsiReference.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/references/MavenUrlPsiReference.java @@ -19,6 +19,7 @@ import com.intellij.ide.BrowserUtil; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiElement; import com.intellij.psi.impl.FakePsiElement; +import org.jetbrains.annotations.NotNull; public class MavenUrlPsiReference extends MavenPsiReference { public MavenUrlPsiReference(PsiElement element, String text, TextRange range) { @@ -43,6 +44,7 @@ public class MavenUrlPsiReference extends MavenPsiReference { }; } + @NotNull public Object[] getVariants() { return EMPTY_ARRAY; } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenDomApplicationComponent.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenDomApplicationComponent.java new file mode 100644 index 000000000000..6a0724e5d79d --- /dev/null +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenDomApplicationComponent.java @@ -0,0 +1,82 @@ +/* + * Copyright 2000-2010 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.idea.maven.utils; + +import com.intellij.codeInsight.template.impl.TemplateSettings; +import com.intellij.ide.highlighter.XmlFileType; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.PathMacros; +import com.intellij.openapi.components.ApplicationComponent; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.fileTypes.FileTypeManager; +import com.intellij.openapi.util.JDOMUtil; +import com.intellij.util.xml.ElementPresentationManager; +import com.intellij.util.xml.TypeNameManager; +import org.jdom.Document; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.idea.maven.dom.MavenDomBundle; +import org.jetbrains.idea.maven.dom.model.MavenDomDependency; +import org.jetbrains.idea.maven.dom.model.MavenDomPlugin; +import org.jetbrains.idea.maven.dom.model.MavenDomRepository; +import org.jetbrains.idea.maven.embedder.MavenEmbedderFactory; + +import java.io.File; + +public class MavenDomApplicationComponent implements ApplicationComponent { + + private static final Logger LOG = Logger.getInstance(MavenDomApplicationComponent.class.getName()); + @NonNls private static final String LIVE_TEMPLATES_DIR = "/liveTemplates/"; + @NonNls private static final String[] LIVE_TEMPLATES_FILES = {"maven_generate_dom.xml"}; + + + @NotNull + public String getComponentName() { + return MavenDomApplicationComponent.class.getName(); + } + + public void initComponent() { + registerLiveTemplates(); + registerPresentations(); + } + + private static void registerPresentations() { + TypeNameManager.registerTypeName(MavenDomRepository.class, MavenDomBundle.message("maven.repository")); + TypeNameManager.registerTypeName(MavenDomPlugin.class, MavenDomBundle.message("maven.plugin")); + TypeNameManager.registerTypeName(MavenDomDependency.class, MavenDomBundle.message("maven.dependency")); + + ElementPresentationManager.registerIcon(MavenDomRepository.class, MavenIcons.PLUGIN_ICON); + ElementPresentationManager.registerIcon(MavenDomDependency.class, MavenIcons.DEPENDENCY_ICON); + ElementPresentationManager.registerIcon(MavenDomPlugin.class, MavenIcons.PLUGIN_ICON); + } + + private static void registerLiveTemplates() { + final TemplateSettings settings = TemplateSettings.getInstance(); + for (String templatesFile : LIVE_TEMPLATES_FILES) { + try { + final Document document = + JDOMUtil.loadDocument(MavenDomApplicationComponent.class.getResourceAsStream(LIVE_TEMPLATES_DIR + templatesFile)); + settings.readHiddenTemplateFile(document); + } + catch (Exception e) { + LOG.error("Can't load " + templatesFile, e); + } + } + } + public void disposeComponent() { + } +} \ No newline at end of file diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenIcons.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenIcons.java index 70ed4ce5d809..ebb37821528f 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenIcons.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenIcons.java @@ -30,6 +30,7 @@ public class MavenIcons { public static final Icon OPEN_PLUGINS_ICON = IconLoader.getIcon("/images/phasesOpen.png"); public static final Icon CLOSED_PLUGINS_ICON = IconLoader.getIcon("/images/phasesClosed.png"); public static final Icon PLUGIN_ICON = IconLoader.getIcon("/images/mavenPlugin.png"); + public static final Icon REPOSITORY_ICON = IconLoader.getIcon("/images/mavenPlugin.png"); public static final Icon PLUGIN_GOAL_ICON = IconLoader.getIcon("/images/pluginGoal.png"); public static final Icon OPEN_DEPENDENCIES_ICON = IconLoader.getIcon("/nodes/ppLibOpen.png"); public static final Icon CLOSED_DEPENDENCIES_ICON = IconLoader.getIcon("/nodes/ppLibClosed.png"); diff --git a/plugins/maven/src/main/resources/DomBundle.properties b/plugins/maven/src/main/resources/DomBundle.properties index d05b3c5fef93..7c13e9ff6cda 100644 --- a/plugins/maven/src/main/resources/DomBundle.properties +++ b/plugins/maven/src/main/resources/DomBundle.properties @@ -6,3 +6,13 @@ fix.update.indices=Update Maven Indices fix.parent.path=Fix relative path fix.open.file=Open ''{0}'' intention.choose.file=Choose File + +maven.repository=Repository +maven.dependency=Dependency +maven.plugin=Plugin + +generate.dependency.artifact=Dependency (artifact) +generate.dependency.group=Dependency (group) + +generate.plugin.artifact=Plugin (artifact) +generate.plugin.group=Plugin (group) diff --git a/plugins/maven/src/main/resources/META-INF/plugin.xml b/plugins/maven/src/main/resources/META-INF/plugin.xml index 40cb2496fd52..4b03ff015789 100644 --- a/plugins/maven/src/main/resources/META-INF/plugin.xml +++ b/plugins/maven/src/main/resources/META-INF/plugin.xml @@ -44,8 +44,10 @@ - - + + @@ -54,7 +56,8 @@ - + @@ -67,6 +70,9 @@ + + @@ -80,6 +86,8 @@ + + @@ -92,6 +100,9 @@ org.jetbrains.idea.maven.vfs.MavenPropertiesVirtualFileSystem + + org.jetbrains.idea.maven.utils.MavenDomApplicationComponent + @@ -275,6 +286,10 @@ class="org.jetbrains.idea.maven.tasks.actions.AssignShortcutAction" text="Assign Shortcut..." description="Assign shortcutto selected phase/goal"> + + + + diff --git a/plugins/maven/src/main/resources/images/repository.png b/plugins/maven/src/main/resources/images/repository.png new file mode 100644 index 000000000000..6042fbbfba1c Binary files /dev/null and b/plugins/maven/src/main/resources/images/repository.png differ diff --git a/plugins/maven/src/main/resources/liveTemplates/maven_generate_dom.xml b/plugins/maven/src/main/resources/liveTemplates/maven_generate_dom.xml new file mode 100644 index 000000000000..dbdb01a65cd0 --- /dev/null +++ b/plugins/maven/src/main/resources/liveTemplates/maven_generate_dom.xml @@ -0,0 +1,144 @@ + + + + + + + + + + + + + +