/******************************************************************************* * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * *******************************************************************************/ package com.liferay.ide.project.core; import com.liferay.ide.core.ILiferayConstants; import com.liferay.ide.sdk.core.ISDKConstants; import com.liferay.ide.sdk.core.SDK; import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IncrementalProjectBuilder; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.SubProgressMonitor; import org.eclipse.jdt.core.ClasspathContainerInitializer; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.internal.core.ClasspathEntry; import org.eclipse.jst.common.jdt.internal.classpath.FlexibleProjectContainer; import org.eclipse.jst.j2ee.internal.common.classpath.J2EEComponentClasspathContainerUtils; import org.eclipse.osgi.util.NLS; /** * @author Gregory Amerson * @author Simon Jiang */ @SuppressWarnings( "restriction" ) public class SDKProjectBuilder extends AbstractProjectBuilder { private SDK sdk; public SDKProjectBuilder( IProject project, SDK sdk ) { super( project ); this.sdk = sdk; } @Override public IStatus buildLang( IFile langFile, IProgressMonitor monitor ) throws CoreException { IStatus status = sdk.validate(); if ( !status.isOK()) { return status; } return sdk.buildLanguage( getProject(), langFile, null, monitor ); } @Override public IStatus buildService( IProgressMonitor monitor ) throws CoreException { final IFile servicesFile = getDocrootFile( "WEB-INF/" + ILiferayConstants.SERVICE_XML_FILE ); if( servicesFile != null && servicesFile.exists() ) { final IProgressMonitor sub = new SubProgressMonitor( monitor, 100 ); sub.beginTask( Msgs.buildingServices, 100 ); return buildService( servicesFile, sub ); } return Status.OK_STATUS; } private IStatus buildService( IFile serviceXmlFile, IProgressMonitor monitor ) throws CoreException { IStatus status = sdk.validate(); if ( !status.isOK() ) { return status; } IStatus retval = sdk.buildService( getProject(), serviceXmlFile, null ); try { getProject().refreshLocal( IResource.DEPTH_INFINITE, monitor ); } catch( Exception e ) { retval = ProjectCore.createErrorStatus( e ); } ResourcesPlugin.getWorkspace().build( IncrementalProjectBuilder.INCREMENTAL_BUILD, monitor ); updateClasspath( getProject() ); getProject().refreshLocal( IResource.DEPTH_INFINITE, monitor ); return retval; } @Override public IStatus buildWSDD( IProgressMonitor monitor ) throws CoreException { final IFile servicesFile = getDocrootFile( "WEB-INF/" + ILiferayConstants.SERVICE_XML_FILE ); if( servicesFile != null && servicesFile.exists() ) { final IProgressMonitor sub = new SubProgressMonitor( monitor, 100 ); sub.beginTask( Msgs.buildingServices, 100 ); return buildWSDD( servicesFile, sub ); } return Status.OK_STATUS; } private IStatus buildWSDD( IFile serviceXmlFile, IProgressMonitor monitor ) throws CoreException { IStatus status = sdk.validate(); if ( !status.isOK() ) { return status; } IStatus retval = sdk.buildWSDD( getProject(), serviceXmlFile, null ); try { getProject().refreshLocal( IResource.DEPTH_INFINITE, monitor ); } catch( Exception e ) { retval = ProjectCore.createErrorStatus( e ); } getProject().build( IncrementalProjectBuilder.INCREMENTAL_BUILD, monitor ); try { getProject().refreshLocal( IResource.DEPTH_INFINITE, monitor ); } catch( Exception e ) { ProjectCore.logError( e ); } return retval; } protected IStatus updateClasspath( IProject project ) throws CoreException { FlexibleProjectContainer container = J2EEComponentClasspathContainerUtils.getInstalledWebAppLibrariesContainer( project ); if( container == null ) { return Status.OK_STATUS; } container.refresh(); container = J2EEComponentClasspathContainerUtils.getInstalledWebAppLibrariesContainer( project ); IClasspathEntry[] webappEntries = container.getClasspathEntries(); for( IClasspathEntry entry2 : webappEntries ) { if( entry2.getPath().lastSegment().equals( getProject().getName() + "-service.jar" ) ) //$NON-NLS-1$ { ( (ClasspathEntry) entry2 ).sourceAttachmentPath = getProject().getFolder( ISDKConstants.DEFAULT_DOCROOT_FOLDER + "/WEB-INF/service" ).getFullPath(); //$NON-NLS-1$ break; } } ClasspathContainerInitializer initializer = JavaCore.getClasspathContainerInitializer( "org.eclipse.jst.j2ee.internal.web.container" ); //$NON-NLS-1$ IJavaProject javaProject = JavaCore.create( project ); initializer.requestClasspathContainerUpdate( container.getPath(), javaProject, container ); return Status.OK_STATUS; } protected static class Msgs extends NLS { public static String buildingServices; public static String buildingWSDD; static { initializeMessages( SDKProjectBuilder.class.getName(), Msgs.class ); } } @Override public IStatus execInitBundle( IProject project, String taskName, String bundleUrl, IProgressMonitor monitor ) throws CoreException { return Status.OK_STATUS; } @Override public IStatus updateProjectDependency( IProject project, List<String[]> dependency ) throws CoreException { throw new CoreException(ProjectCore.createErrorStatus("Not implemented")); } }