2 * Copyright 2000-2009 JetBrains s.r.o.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package com
.intellij
.javadoc
;
18 import com
.intellij
.CommonBundle
;
19 import com
.intellij
.execution
.ExecutionException
;
20 import com
.intellij
.execution
.RunnerRegistry
;
21 import com
.intellij
.execution
.executors
.DefaultRunExecutor
;
22 import com
.intellij
.execution
.runners
.ExecutionEnvironment
;
23 import com
.intellij
.execution
.runners
.ProgramRunner
;
24 import com
.intellij
.execution
.util
.ExecutionErrorDialog
;
25 import com
.intellij
.ide
.DataManager
;
26 import com
.intellij
.openapi
.actionSystem
.DataConstants
;
27 import com
.intellij
.openapi
.actionSystem
.DataContext
;
28 import com
.intellij
.openapi
.actionSystem
.impl
.SimpleDataContext
;
29 import com
.intellij
.openapi
.components
.AbstractProjectComponent
;
30 import com
.intellij
.openapi
.module
.Module
;
31 import com
.intellij
.openapi
.module
.ModuleUtil
;
32 import com
.intellij
.openapi
.project
.Project
;
33 import com
.intellij
.openapi
.roots
.ContentEntry
;
34 import com
.intellij
.openapi
.roots
.ModuleRootManager
;
35 import com
.intellij
.openapi
.roots
.SourceFolder
;
36 import com
.intellij
.openapi
.util
.InvalidDataException
;
37 import com
.intellij
.openapi
.util
.JDOMExternalizable
;
38 import com
.intellij
.openapi
.util
.WriteExternalException
;
39 import com
.intellij
.psi
.JavaDirectoryService
;
40 import com
.intellij
.psi
.PsiDirectory
;
41 import com
.intellij
.psi
.PsiPackage
;
42 import org
.jdom
.Element
;
43 import org
.jetbrains
.annotations
.NotNull
;
47 public final class JavadocGenerationManager
extends AbstractProjectComponent
implements JDOMExternalizable
{
48 private final JavadocConfiguration myConfiguration
;
50 public static JavadocGenerationManager
getInstance(Project project
) {
51 return project
.getComponent(JavadocGenerationManager
.class);
54 JavadocGenerationManager(Project project
) {
56 myConfiguration
= new JavadocConfiguration(project
);
59 public void generateJavadoc(final PsiDirectory directory
, DataContext dataContext
) {
60 Component component
= (Component
)dataContext
.getData(DataConstants
.CONTEXT_COMPONENT
);
61 final PsiPackage aPackage
= directory
!= null ? JavaDirectoryService
.getInstance().getPackage(directory
) : null;
62 String packageFQName
= aPackage
!= null ? aPackage
.getQualifiedName() : null;
64 final GenerateJavadocDialog dialog
= new GenerateJavadocDialog(packageFQName
, myProject
, myConfiguration
);
70 if (component
!= null) {
71 dataContext
= DataManager
.getInstance().getDataContext(component
);
74 dataContext
= SimpleDataContext
.getProjectContext(myProject
);
77 if (dialog
.isGenerationForPackage() && !dialog
.isGenerationWithSubpackages()) {
78 //remove package prefixes from javadoc.exe command
79 final Module module
= directory
!= null ? ModuleUtil
.findModuleForPsiElement(directory
) : null;
80 if (module
!= null && packageFQName
!= null){
81 boolean reset
= false;
82 final ContentEntry
[] contentEntries
= ModuleRootManager
.getInstance(module
).getContentEntries();
83 for (ContentEntry contentEntry
: contentEntries
) {
84 final SourceFolder
[] sourceFolders
= contentEntry
.getSourceFolders();
85 for (SourceFolder sourceFolder
: sourceFolders
) {
86 final String packagePrefix
= sourceFolder
.getPackagePrefix();
87 final int prefixLength
= packagePrefix
.length();
88 if (prefixLength
> 0 && packageFQName
.startsWith(packagePrefix
) && packageFQName
.length() > prefixLength
){
89 packageFQName
= packageFQName
.substring(prefixLength
+ 1);
99 myConfiguration
.setGenerationOptions(new JavadocConfiguration
.GenerationOptions(packageFQName
, directory
, dialog
.isGenerationForPackage(),
100 dialog
.isGenerationWithSubpackages()));
102 final ProgramRunner runner
= RunnerRegistry
.getInstance().getRunner(DefaultRunExecutor
.EXECUTOR_ID
, myConfiguration
);
103 assert runner
!= null;
104 runner
.execute(DefaultRunExecutor
.getRunExecutorInstance(), new ExecutionEnvironment(myConfiguration
, dataContext
));
106 catch (ExecutionException e
) {
107 ExecutionErrorDialog
.show(e
, CommonBundle
.getErrorTitle(), myProject
);
113 public String
getComponentName() {
114 return "JavadocGenerationManager";
117 public void readExternal(Element element
) throws InvalidDataException
{
118 myConfiguration
.readExternal(element
);
121 public void writeExternal(Element element
) throws WriteExternalException
{
122 myConfiguration
.writeExternal(element
);
125 public JavadocConfiguration
getConfiguration() {
126 return myConfiguration
;