/*******************************************************************************
* Copyright (c) 2012-2015 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.extension.ant.client;
import org.eclipse.che.ide.api.project.client.ProjectServiceClient;
import org.eclipse.che.api.project.shared.dto.ProjectDescriptor;
import org.eclipse.che.ide.api.event.FileEvent;
import org.eclipse.che.ide.api.event.FileEventHandler;
import org.eclipse.che.ide.api.event.ProjectActionEvent;
import org.eclipse.che.ide.api.event.ProjectActionHandler;
import org.eclipse.che.ide.api.event.RefreshProjectTreeEvent;
import org.eclipse.che.ide.api.extension.Extension;
import org.eclipse.che.ide.api.project.tree.TreeStructureProviderRegistry;
import org.eclipse.che.ide.api.project.tree.generic.ProjectNode;
import org.eclipse.che.ide.ext.java.client.dependenciesupdater.DependenciesUpdater;
import org.eclipse.che.ide.ext.java.shared.Constants;
import org.eclipse.che.ide.extension.ant.client.projecttree.AntProjectTreeStructureProvider;
import org.eclipse.che.ide.extension.ant.shared.AntAttributes;
import org.eclipse.che.ide.rest.AsyncRequestCallback;
import org.eclipse.che.ide.rest.DtoUnmarshallerFactory;
import org.eclipse.che.ide.rest.Unmarshallable;
import org.eclipse.che.ide.util.loging.Log;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.google.web.bindery.event.shared.EventBus;
/**
* Extension for support Ant projects.
*
* @author Vladyslav Zhukovskii
*/
@Singleton
@Extension(title = "Ant", version = "3.0.0")
public class AntExtension {
/** Create instance of {@link AntExtension}. */
@Inject
public AntExtension(final EventBus eventBus,
final DependenciesUpdater dependenciesUpdater,
final DtoUnmarshallerFactory dtoUnmarshallerFactory,
final ProjectServiceClient projectServiceClient,
TreeStructureProviderRegistry treeStructureProviderRegistry) {
// Handle project opened event to fire update dependencies.
eventBus.addHandler(ProjectActionEvent.TYPE, new ProjectActionHandler() {
@Override
public void onProjectOpened(ProjectActionEvent event) {
ProjectDescriptor project = event.getProject();
if (AntAttributes.ANT_ID.equals(project.getType())
&& project.getAttributes().containsKey(Constants.LANGUAGE)
&& project.getAttributes().get(Constants.LANGUAGE).get(0).equals("java")) {
dependenciesUpdater.updateDependencies(project, false);
}
}
@Override
public void onProjectClosing(ProjectActionEvent event) {
}
@Override
public void onProjectClosed(ProjectActionEvent event) {
}
});
// Handle build.xml file save operation and if ant configuration has been changed reload project tree.
// For example, if user provide custom source directory.
eventBus.addHandler(FileEvent.TYPE, new FileEventHandler() {
@Override
public void onFileOperation(final FileEvent event) {
if (event.getOperationType() == FileEvent.FileOperation.SAVE && "build.xml".equals(event.getFile().getName())) {
final ProjectNode project = event.getFile().getProject();
Unmarshallable<ProjectDescriptor> unmarshaller = dtoUnmarshallerFactory.newUnmarshaller(ProjectDescriptor.class);
projectServiceClient.getProject(project.getData().getPath(),
new AsyncRequestCallback<ProjectDescriptor>(unmarshaller) {
@Override
protected void onSuccess(ProjectDescriptor result) {
if (!result.getAttributes().equals(project.getData().getAttributes())) {
project.setData(result);
eventBus.fireEvent(new RefreshProjectTreeEvent(project));
}
}
@Override
protected void onFailure(Throwable exception) {
Log.info(getClass(), "Unable to get the project.", exception);
}
}
);
}
}
});
treeStructureProviderRegistry.associateProjectTypeToTreeProvider(AntAttributes.ANT_ID, AntProjectTreeStructureProvider.ID);
}
}