kill the rest of DataAccessor framework, use DataKeys everywhere consistently

This commit is contained in:
Dmitry Jemerov
2010-01-07 13:58:29 +03:00
parent 73ced18930
commit 3f62c2789f
11 changed files with 45 additions and 262 deletions
@@ -1,36 +0,0 @@
/*
* 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 com.intellij.ide;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.psi.JavaDirectoryService;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiPackage;
public class JavaDataAccessors {
public static final DataAccessor<PsiPackage> FILE_PACKAGE = new DataAccessor<PsiPackage>() {
public PsiPackage getImpl(DataContext dataContext) throws NoDataException {
PsiFile psiFile = DataAccessors.PSI_FILE.getNotNull(dataContext);
PsiDirectory containingDirectory = psiFile.getContainingDirectory();
if (containingDirectory == null || !containingDirectory.isValid()) return null;
return JavaDirectoryService.getInstance().getPackage(containingDirectory);
}
};
private JavaDataAccessors() {
}
}
@@ -15,14 +15,13 @@
*/
package com.intellij.ide.macro;
import com.intellij.ide.IdeBundle;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.psi.PsiPackage;
import com.intellij.ide.IdeBundle;
import com.intellij.ide.JavaDataAccessors;
public class FileFQPackage extends Macro {
public String expand(DataContext dataContext) throws Macro.ExecutionCancelledException {
PsiPackage aPackage = JavaDataAccessors.FILE_PACKAGE.from(dataContext);
public String expand(DataContext dataContext) {
PsiPackage aPackage = FilePackageMacro.getFilePackage(dataContext);
if (aPackage == null) return null;
return aPackage.getQualifiedName();
}
@@ -15,10 +15,14 @@
*/
package com.intellij.ide.macro;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.psi.PsiPackage;
import com.intellij.ide.IdeBundle;
import com.intellij.ide.JavaDataAccessors;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.DataKeys;
import com.intellij.psi.JavaDirectoryService;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiPackage;
import org.jetbrains.annotations.Nullable;
public final class FilePackageMacro extends Macro {
public String getName() {
@@ -30,8 +34,17 @@ public final class FilePackageMacro extends Macro {
}
public String expand(DataContext dataContext) {
PsiPackage aPackage = JavaDataAccessors.FILE_PACKAGE.from(dataContext);
PsiPackage aPackage = getFilePackage(dataContext);
if (aPackage == null) return null;
return aPackage.getName();
}
@Nullable
static PsiPackage getFilePackage(DataContext dataContext) {
PsiFile psiFile = DataKeys.PSI_FILE.getData(dataContext);
if (psiFile == null) return null;
PsiDirectory containingDirectory = psiFile.getContainingDirectory();
if (containingDirectory == null || !containingDirectory.isValid()) return null;
return JavaDirectoryService.getInstance().getPackage(containingDirectory);
}
}
@@ -1,68 +0,0 @@
/*
* 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 com.intellij.ide;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.LangDataKeys;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
/**
* @author yole
*/
public class DataAccessors {
@Deprecated
public static final DataAccessor<Project> PROJECT = new DataAccessor.SimpleDataAccessor<Project>(PlatformDataKeys.PROJECT.getName());
@Deprecated
public static final DataAccessor<Module> MODULE = new DataAccessor.SimpleDataAccessor<Module>(LangDataKeys.MODULE.getName());
public static final DataAccessor<PsiManager> PSI_MANAGER = new DataAccessor<PsiManager>() {
public PsiManager getImpl(DataContext dataContext) throws NoDataException {
return PsiManager.getInstance(PROJECT.getNotNull(dataContext));
}
};
public static final DataAccessor<PsiFile> PSI_FILE = new DataAccessor<PsiFile>() {
public PsiFile getImpl(DataContext dataContext) throws NoDataException {
return PSI_MANAGER.getNotNull(dataContext).findFile(VIRTUAL_FILE.getNotNull(dataContext));
}
};
public static final DataAccessor<VirtualFile> VIRTUAL_FILE = new DataAccessor.SimpleDataAccessor<VirtualFile>(PlatformDataKeys.VIRTUAL_FILE.getName());
public static final DataAccessor<VirtualFile> VIRTUAL_DIR_OR_PARENT = new DataAccessor<VirtualFile>() {
public VirtualFile getImpl(DataContext dataContext) throws NoDataException {
VirtualFile virtualFile = VIRTUAL_FILE.getNotNull(dataContext);
return virtualFile.isDirectory() ? virtualFile : virtualFile.getParent();
}
};
public static final DataAccessor<VirtualFile> PROJECT_BASE_DIR = new DataAccessor<VirtualFile>() {
public VirtualFile getImpl(DataContext dataContext) throws NoDataException {
Project project = PROJECT.getNotNull(dataContext);
return project.getBaseDir();
}
};
public static final DataAccessor<String> MODULE_FILE_PATH = new DataAccessor<String>() {
public String getImpl(DataContext dataContext) throws NoDataException {
Module module = MODULE.getNotNull(dataContext);
return module.getModuleFilePath();
}
};
private DataAccessors() {
}
}
@@ -16,7 +16,6 @@
package com.intellij.ide.macro;
import com.intellij.ide.DataAccessors;
import com.intellij.ide.IdeBundle;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.vfs.VirtualFile;
@@ -31,16 +30,7 @@ public final class FileDirMacro extends Macro {
}
public String expand(DataContext dataContext) {
//Project project = (Project)dataContext.getData(DataConstants.PROJECT);
//if (project == null) return null;
//VirtualFile file = (VirtualFile)dataContext.getData(DataConstantsEx.VIRTUAL_FILE);
//if (file == null) return null;
//if (!file.isDirectory()) {
// file = file.getParent();
// if (file == null) return null;
//}
VirtualFile dir = DataAccessors.VIRTUAL_DIR_OR_PARENT.from(dataContext);
if (dir == null) return null;
return getPath(dir);
VirtualFile vFile = getVirtualDirOrParent(dataContext);
return vFile != null ? getPath(vFile) : null;
}
}
@@ -16,9 +16,9 @@
package com.intellij.ide.macro;
import com.intellij.ide.DataAccessors;
import com.intellij.ide.IdeBundle;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
@@ -33,20 +33,12 @@ public class FileRelativeDirMacro extends Macro {
}
public String expand(DataContext dataContext) {
//Project project = (Project)dataContext.getData(DataConstants.PROJECT);
//if (project == null) return null;
//VirtualFile file = (VirtualFile)dataContext.getData(DataConstantsEx.VIRTUAL_FILE);
//if (file == null) return null;
//if (!file.isDirectory()){
// file = file.getParent();
// if (file == null) return null;
//}
final VirtualFile baseDir = DataAccessors.PROJECT_BASE_DIR.from(dataContext);
final VirtualFile baseDir = PlatformDataKeys.PROJECT_FILE_DIRECTORY.getData(dataContext);
if (baseDir == null) {
return null;
}
VirtualFile dir = DataAccessors.VIRTUAL_DIR_OR_PARENT.from(dataContext);
VirtualFile dir = getVirtualDirOrParent(dataContext);
if (dir == null) return null;
return FileUtil.getRelativePath(VfsUtil.virtualToIoFile(baseDir), VfsUtil.virtualToIoFile(dir));
}
@@ -17,6 +17,7 @@
package com.intellij.ide.macro;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.NonNls;
@@ -61,6 +62,15 @@ public abstract class Macro {
return new File(getPath(file));
}
@Nullable
protected static VirtualFile getVirtualDirOrParent(DataContext dataContext) {
VirtualFile vFile = PlatformDataKeys.VIRTUAL_FILE.getData(dataContext);
if (vFile != null && !vFile.isDirectory()) {
vFile = vFile.getParent();
}
return vFile;
}
public static class Silent extends Macro {
private final Macro myDelegate;
private final String myValue;
@@ -16,9 +16,10 @@
package com.intellij.ide.macro;
import com.intellij.ide.DataAccessors;
import com.intellij.ide.IdeBundle;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.LangDataKeys;
import com.intellij.openapi.module.Module;
import java.io.File;
@@ -32,7 +33,8 @@ public final class ModuleFileDirMacro extends Macro {
}
public String expand(DataContext dataContext) {
final String path = DataAccessors.MODULE_FILE_PATH.from(dataContext);
final Module module = LangDataKeys.MODULE.getData(dataContext);
final String path = module != null ? module.getModuleFilePath() : null;
if (path == null) {
return null;
}
@@ -16,9 +16,10 @@
package com.intellij.ide.macro;
import com.intellij.ide.DataAccessors;
import com.intellij.ide.IdeBundle;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.LangDataKeys;
import com.intellij.openapi.module.Module;
public final class ModuleFilePathMacro extends Macro {
public String getName() {
@@ -30,6 +31,7 @@ public final class ModuleFilePathMacro extends Macro {
}
public String expand(DataContext dataContext) {
return DataAccessors.MODULE_FILE_PATH.from(dataContext);
final Module module = LangDataKeys.MODULE.getData(dataContext);
return module != null ? module.getModuleFilePath() : null;
}
}
@@ -16,9 +16,9 @@
package com.intellij.ide.macro;
import com.intellij.ide.DataAccessors;
import com.intellij.ide.IdeBundle;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.actionSystem.PlatformDataKeys;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.Nullable;
@@ -34,7 +34,7 @@ public final class ProjectFileDirMacro extends Macro {
@Nullable
public String expand(DataContext dataContext) {
final VirtualFile baseDir = DataAccessors.PROJECT_BASE_DIR.from(dataContext);
final VirtualFile baseDir = PlatformDataKeys.PROJECT_FILE_DIRECTORY.getData(dataContext);
if (baseDir == null) {
return null;
}
@@ -1,121 +0,0 @@
/*
* 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 com.intellij.ide;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.util.Condition;
import com.intellij.util.Function;
import static com.intellij.util.containers.ContainerUtil.map;
import static com.intellij.util.containers.ContainerUtil.skipNulls;
import java.lang.reflect.Array;
import java.util.List;
public abstract class DataAccessor<T> {
public final T from(DataContext dataContext) {
try {
return getNotNull(dataContext);
} catch(NoDataException e) {
return null;
}
}
protected abstract T getImpl(DataContext dataContext) throws NoDataException;
public final T getNotNull(DataContext dataContext) throws NoDataException {
T data = getImpl(dataContext);
if (data == null) throw new NoDataException(toString());
return data;
}
public static <T, Original> DataAccessor<T> createConvertor(final DataAccessor<Original> original,
final Function<Original, T> convertor) {
return new DataAccessor<T>(){
public T getImpl(DataContext dataContext) throws NoDataException {
return convertor.fun(original.getNotNull(dataContext));
}
};
}
public static <T, Original> DataAccessor<T[]> createArrayConvertor(final DataAccessor<Original[]> original, final Function<Original, T> convertor, final Class<T> aClass) {
return new DataAccessor<T[]>() {
public T[] getImpl(DataContext dataContext) throws NoDataException {
List<T> converted = skipNulls(map(original.getNotNull(dataContext), convertor));
return converted.toArray((T[])Array.newInstance(aClass, converted.size()));
}
};
}
public static <T> DataAccessor<T> createConditionalAccessor(DataAccessor<T> accessor, Condition<T> condition) {
return new ConditionalDataAccessor<T>(accessor, condition);
}
public static class SimpleDataAccessor<T> extends DataAccessor<T> {
private final String myDataConstant;
public SimpleDataAccessor(String dataConstant) {
myDataConstant = dataConstant;
}
public T getImpl(DataContext dataContext) throws NoDataException {
T data = (T)dataContext.getData(myDataConstant);
if (data == null) throw new NoDataException(myDataConstant);
return data;
}
}
public static class SubClassDataAccessor<Super, Sub> extends DataAccessor<Sub> {
private final DataAccessor<Super> myOriginal;
private final Class<Sub> mySubClass;
SubClassDataAccessor(DataAccessor<Super> original, Class<Sub> subClass) {
myOriginal = original;
mySubClass = subClass;
}
public Sub getImpl(DataContext dataContext) throws NoDataException {
Object data = myOriginal.getNotNull(dataContext);
if (!mySubClass.isInstance(data)) return null;
return (Sub)data;
}
public static <Super, Sub extends Super> DataAccessor<Sub> create(DataAccessor<Super> accessor, Class<Sub> subClass) {
return new SubClassDataAccessor<Super, Sub>(accessor, subClass);
}
}
private static class ConditionalDataAccessor<T> extends DataAccessor<T> {
private final DataAccessor<T> myOriginal;
private final Condition<T> myCondition;
public ConditionalDataAccessor(DataAccessor<T> original, Condition<T> condition) {
myOriginal = original;
myCondition = condition;
}
public T getImpl(DataContext dataContext) throws NoDataException {
T value = myOriginal.getNotNull(dataContext);
return myCondition.value(value) ? value : null;
}
}
public static class NoDataException extends Exception {
public NoDataException(String missingData) {
super(IdeBundle.message("exception.missing.data", missingData));
}
}
}