/******************************************************************************* * Copyright (c) 2006-2010 eBay Inc. All Rights Reserved. * 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 *******************************************************************************/ package org.ebayopensource.turmeric.eclipse.maven.sconfig; import java.util.ArrayList; import java.util.List; import org.apache.maven.model.Plugin; import org.apache.maven.model.PluginExecution; import org.apache.maven.project.MavenProject; import org.ebayopensource.turmeric.eclipse.core.resources.constants.SOAProjectConstants; import org.ebayopensource.turmeric.eclipse.core.resources.constants.SOAProjectConstants.SupportedProjectType; import org.ebayopensource.turmeric.eclipse.repositorysystem.core.GlobalRepositorySystem; import org.ebayopensource.turmeric.eclipse.utils.collections.ListUtil; import org.ebayopensource.turmeric.eclipse.utils.plugin.JDTUtil; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; import org.maven.ide.eclipse.project.configurator.AbstractProjectConfigurator; import org.maven.ide.eclipse.project.configurator.ProjectConfigurationRequest; /** * The Class TurmerStandardProjectConfigurator. */ public class TurmerStandardProjectConfigurator extends AbstractProjectConfigurator { private static final String GEN_TYPELIBRARY = "gen-typelibrary"; private static final String GEN_ERRORLIBRARY = "gen-errorlibrary"; private static final String GEN_IMPLEMENTATION = "gen-implementation"; private static final String GEN_INTERFACE_WSDL = "gen-interface-wsdl"; private static final String TURMERIC_MAVEN_PLUGIN = "turmeric-maven-plugin"; /** * Instantiates a new turmer standard project configurator. */ public TurmerStandardProjectConfigurator() { } /* (non-Javadoc) * @see org.maven.ide.eclipse.project.configurator.AbstractProjectConfigurator#configure(org.maven.ide.eclipse.project.configurator.ProjectConfigurationRequest, org.eclipse.core.runtime.IProgressMonitor) */ @Override public void configure(ProjectConfigurationRequest projRequest, IProgressMonitor monitor) throws CoreException { if (projRequest == null) { return; } SupportedProjectType projectType = null; IProject project = projRequest.getProject(); if (isInterfaceProject(projRequest)) { projectType = SupportedProjectType.INTERFACE; } else if (isImplementationProject(projRequest)) { projectType = SupportedProjectType.IMPL; } else if (isErrorLibProject(projRequest)) { projectType = SupportedProjectType.ERROR_LIBRARY; } else if (isTypeLibProject(projRequest)) { projectType = SupportedProjectType.TYPE_LIBRARY; } else if (isConsumerLibProject(projRequest)) { projectType = SupportedProjectType.CONSUMER; } else { return; } String natureId = GlobalRepositorySystem.instanceOf() .getActiveRepositorySystem().getProjectNatureId(projectType); JDTUtil.addNatures(project, monitor, natureId); List<IPath> additionalSrcDirs = new ArrayList<IPath>(); additionalSrcDirs.add(new Path("target/generated-sources/codegen")); additionalSrcDirs.add(new Path("target/generated-resources/codegen")); final IJavaProject javaProject = JavaCore.create(project); final List<IClasspathEntry> entries = ListUtil.arrayList(javaProject .readRawClasspath()); for (IPath path : additionalSrcDirs) { IFolder folder = project.getFolder(path); if (folder.exists()) { IPath srcPath = project.getFolder(path).getFullPath(); if (containsSourcePath(entries, srcPath) == false) { entries.add(JavaCore.newSourceEntry(srcPath, new IPath[0])); } } } javaProject.setRawClasspath(entries.toArray(new IClasspathEntry[0]), monitor); } private boolean containsSourcePath(List<IClasspathEntry> entries, IPath srcPath) { for (IClasspathEntry entry : entries) { if (entry.getPath().equals(srcPath)) return true; } return false; } /** * Checks if is interface project. * * @param projRequest the proj request * @return true, if is interface project */ public boolean isInterfaceProject(ProjectConfigurationRequest projRequest) { return isProjectType(GEN_INTERFACE_WSDL, projRequest); } private boolean isProjectType(String goalType, ProjectConfigurationRequest projRequest) { MavenProject mproj = projRequest.getMavenProject(); List<Plugin> buildPlugins = mproj.getBuildPlugins(); for (Plugin mplug : buildPlugins) { if (TURMERIC_MAVEN_PLUGIN.equals(mplug.getArtifactId())) { List<PluginExecution> exList = mplug.getExecutions(); for (PluginExecution pexec : exList) { List<String> goals = pexec.getGoals(); for (String goal : goals) { if (goalType.equals(goal)) { return true; } } } } } return false; } /** * Checks if is implementation project. * * @param projRequest the proj request * @return true, if is implementation project */ public boolean isImplementationProject( ProjectConfigurationRequest projRequest) { return isProjectType(GEN_IMPLEMENTATION, projRequest); } /** * Checks if is error lib project. * * @param projRequest the proj request * @return true, if is error lib project */ public boolean isErrorLibProject(ProjectConfigurationRequest projRequest) { return isProjectType(GEN_ERRORLIBRARY, projRequest); } /** * Checks if is type lib project. * * @param projRequest the proj request * @return true, if is type lib project */ public boolean isTypeLibProject(ProjectConfigurationRequest projRequest) { return isProjectType(GEN_TYPELIBRARY, projRequest); } /** * Checks if is consumer lib project. * * @param projRequest the proj request * @return true, if is consumer lib project */ public boolean isConsumerLibProject(ProjectConfigurationRequest projRequest) { return isFileAccessible(projRequest.getProject(), SOAProjectConstants.PROPS_FILE_SERVICE_CONSUMER); } private static boolean isFileAccessible(IProject project, String fileRelativePath) { if (project.isAccessible()) { return project.getFile(fileRelativePath).isAccessible(); } return false; } }