Я написал Eclipse-плагин, который в основном позволяет программисту выбирать источник Java в Project Explorer, и, выбрав соответствующий пункт меню DropDown, он создает файл интерфейса .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 & 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 result;
}
public List<UpdatedUnit> getUpdatedUnits() {
return updatedUnits;
}
}
Я добавляю слушателя в рабочую область, теперь у меня возникает вопрос:
Как узнать, когда обновленный список единиц завершен, чтобы выполнитьсписок с моим собственным кодом?Одним из возможных ответов на этот вопрос было бы, не волнуйтесь,:
event.getData().accept(this.buildVisitor());
будет блокироваться до завершения обработки посетителем.но, по крайней мере, не документировано, как было бы.
Любые идеи будут оценены.Заранее спасибо.
Даниил