/*******************************************************************************
* Copyright (c) 2012-2016 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.ide.ext.java.client.editor;
import com.google.inject.assistedinject.Assisted;
import com.google.inject.assistedinject.AssistedInject;
import com.google.web.bindery.event.shared.EventBus;
import com.google.web.bindery.event.shared.HandlerRegistration;
import org.eclipse.che.ide.api.editor.EditorWithErrors;
import org.eclipse.che.ide.api.project.tree.VirtualFile;
import org.eclipse.che.ide.api.text.Region;
import org.eclipse.che.ide.ext.java.client.event.DependencyUpdatedEvent;
import org.eclipse.che.ide.ext.java.client.event.DependencyUpdatedEventHandler;
import org.eclipse.che.ide.ext.java.client.projecttree.JavaSourceFolderUtil;
import org.eclipse.che.ide.ext.java.shared.dto.Problem;
import org.eclipse.che.ide.ext.java.shared.dto.ReconcileResult;
import org.eclipse.che.ide.jseditor.client.annotation.AnnotationModel;
import org.eclipse.che.ide.jseditor.client.document.Document;
import org.eclipse.che.ide.jseditor.client.reconciler.DirtyRegion;
import org.eclipse.che.ide.jseditor.client.reconciler.ReconcilingStrategy;
import org.eclipse.che.ide.jseditor.client.texteditor.EmbeddedTextEditorPresenter;
import org.eclipse.che.ide.util.loging.Log;
import javax.validation.constraints.NotNull;
import java.util.List;
public class JavaReconcilerStrategy implements ReconcilingStrategy {
private final EmbeddedTextEditorPresenter<?> editor;
private final JavaCodeAssistProcessor codeAssistProcessor;
private final AnnotationModel annotationModel;
private final HandlerRegistration handlerRegistration;
private SemanticHighlightRenderer highlighter;
private JavaReconcileClient client;
private VirtualFile file;
private boolean first = true;
@AssistedInject
public JavaReconcilerStrategy(@Assisted @NotNull final EmbeddedTextEditorPresenter<?> editor,
@Assisted final JavaCodeAssistProcessor codeAssistProcessor,
@Assisted final AnnotationModel annotationModel,
final JavaReconcileClient client,
final SemanticHighlightRenderer highlighter,
EventBus eventBus) {
this.editor = editor;
this.client = client;
this.codeAssistProcessor = codeAssistProcessor;
this.annotationModel = annotationModel;
this.highlighter = highlighter;
handlerRegistration = eventBus.addHandler(DependencyUpdatedEvent.TYPE, new DependencyUpdatedEventHandler() {
@Override
public void onDependencyUpdated(DependencyUpdatedEvent event) {
parse();
}
});
}
@Override
public void setDocument(final Document document) {
file = editor.getEditorInput().getFile();
highlighter.init(editor.getHasTextMarkers(), document);
}
@Override
public void reconcile(final DirtyRegion dirtyRegion, final Region subRegion) {
parse();
}
public void parse() {
if (first) {
codeAssistProcessor.disableCodeAssistant();
first = false;
}
String fqn = JavaSourceFolderUtil.getFQNForFile(file);
client.reconcile(file.getProject().getProjectConfig().getPath(), fqn, new JavaReconcileClient.ReconcileCallback() {
@Override
public void onReconcile(ReconcileResult result) {
if (result == null) {
return;
}
doReconcile(result.getProblems());
highlighter.reconcile(result.getHighlightedPositions());
}
});
}
@Override
public void reconcile(final Region partition) {
parse();
}
public VirtualFile getFile() {
return file;
}
private void doReconcile(final List<Problem> problems) {
if (!first) {
codeAssistProcessor.enableCodeAssistant();
}
if (this.annotationModel == null) {
return;
}
ProblemRequester problemRequester;
if (this.annotationModel instanceof ProblemRequester) {
problemRequester = (ProblemRequester)this.annotationModel;
problemRequester.beginReporting();
} else {
editor.setErrorState(EditorWithErrors.EditorState.NONE);
return;
}
try {
boolean error = false;
boolean warning = false;
for (Problem problem : problems) {
if (!error) {
error = problem.isError();
}
if (!warning) {
warning = problem.isWarning();
}
problemRequester.acceptProblem(problem);
}
if (error) {
editor.setErrorState(EditorWithErrors.EditorState.ERROR);
} else if (warning) {
editor.setErrorState(EditorWithErrors.EditorState.WARNING);
} else {
editor.setErrorState(EditorWithErrors.EditorState.NONE);
}
} catch (final Exception e) {
Log.error(getClass(), e);
} finally {
problemRequester.endReporting();
}
}
@Override
public void closeReconciler() {
if (handlerRegistration != null) {
handlerRegistration.removeHandler();
}
}
}