#eclipse #eclipse-plugin
#eclipse #eclipse-плагин
Вопрос:
Я написал плагин Eclipse, который в основном позволяет программисту выбирать исходный код Java из Project Explorer и, выбрав соответствующую опцию выпадающего меню, создает файл interface .java на основе выбранного. Все работает нормально, но теперь мне нужно запрограммировать обновление части задания. Требование обновления простое, мне нужно прослушать изменения и определить, что источники, в которых сгенерирован интерфейс, были изменены, и воссоздать файл интерфейса. Для этого я написал класс, который реализует интерфейс IResourceChangeListener. Этот класс выглядит так:
public class DTOChangeListener implements IResourceChangeListener {
private List<UpdatedUnit> updatedUnits;
public DTOChangeListener() {
super();
this.updatedUnits=new ArrayList<UpdatedUnit>();
}
@Override
public void resourceChanged(IResourceChangeEvent event) {
try{
if(event.getType() == IResourceChangeEvent.POST_CHANGE){
event.getDelta().accept(this.buildVisitor());
}
}catch(CoreException ex){
ex.printStackTrace();
}
}
protected IResourceDeltaVisitor buildVisitor(){
IResourceDeltaVisitor result=new IResourceDeltaVisitor() {
@Override
public boolean visit(IResourceDelta resDelta) throws CoreException {
String resName=resDelta.getResource().getName();
if(resName==null || resName.equals("")){
return true;
}
String[] splits=resName.split("\.");
String name = splits[0];
if(name.contains("PropertyAccess")){
return false;
}
String interfaceName=name "PropertyAccess";
String interfaceFile=interfaceName ".java";
IResource res=resDelta.getResource();
if((res instanceof IFolder) || (res instanceof IProject)){
// Avoid Folder amp; Project Nodes
return true;
}
IProject project=res.getProject();
if(project!=null){
if(project.isNatureEnabled("org.eclipse.jdt.core.javanature")){
IJavaElement element=JavaCore.create(res);
if(element instanceof ICompilationUnit){
ICompilationUnit unit=(ICompilationUnit)element;
IPath path=res.getProjectRelativePath().removeLastSegments(1);
IResource propertyAccess=project.findMember(path.append(interfaceFile));
if(propertyAccess!=null){
UpdatedUnit updatedUnit=new UpdatedUnit(project, path, unit);
updatedUnits.add(updatedUnit);
return false;
}
}
}
}
return true;
}
};
return resu<
}
public List<UpdatedUnit> getUpdatedUnits() {
return updatedUnits;
}
}
Я добавляю слушателя в рабочую область, теперь у меня вопрос:
Как я могу узнать, когда список updatedUnits завершен, чтобы обработать список с помощью моего собственного кода? Одним из возможных ответов на этот вопрос было бы, не волнуйтесь,:
event.getData().accept(this.buildVisitor());
будет блокироваться до завершения обработки посетителя.
но, по крайней мере, не документируется, как это было бы.
Любые идеи будут оценены. Заранее спасибо.
Даниэль
Ответ №1:
Если не задокументировано, что он не блокируется, он блокируется.