/*******************************************************************************
* 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.portlet.core.jsf;
import com.liferay.ide.core.ILiferayProjectProvider;
import com.liferay.ide.core.IWebProject;
import com.liferay.ide.core.LiferayCore;
import com.liferay.ide.core.util.CoreUtil;
import com.liferay.ide.core.util.FileUtil;
import com.liferay.ide.portlet.core.BasePortletFramework;
import com.liferay.ide.portlet.core.PortletCore;
import com.liferay.ide.sdk.core.ISDKConstants;
import com.liferay.ide.sdk.core.SDK;
import com.liferay.ide.sdk.core.SDKUtil;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.util.List;
import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jst.common.project.facet.core.libprov.ILibraryProvider;
import org.eclipse.jst.common.project.facet.core.libprov.LibraryInstallDelegate;
import org.eclipse.jst.jsf.core.IJSFCoreConstants;
import org.eclipse.jst.jsf.core.internal.project.facet.IJSFFacetInstallDataModelProperties;
import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
import org.eclipse.wst.common.project.facet.core.IFacetedProject.Action;
import org.eclipse.wst.common.project.facet.core.IFacetedProjectWorkingCopy;
import org.eclipse.wst.common.project.facet.core.IProjectFacet;
import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
/**
* @author Gregory Amerson
* @author Tao Tao
* @author Simon Jiang
*/
@SuppressWarnings("restriction")
public class JSFPortletFramework extends BasePortletFramework
implements IJSFPortletFrameworkProperties, IJSFFacetInstallDataModelProperties
{
public static final String DEFAULT_FRAMEWORK_NAME = "jsf-2.x";
public static final String JSF_FACET_SUPPORTED_VERSION = "2.0"; //$NON-NLS-1$
public JSFPortletFramework()
{
super();
}
public IStatus configureNewProject( IDataModel dataModel, IFacetedProjectWorkingCopy facetedProject )
{
IProjectFacetVersion jsfFacetVersion = getJSFProjectFacet( facetedProject );
IProjectFacet jsfFacet = PortletCore.JSF_FACET;
if( jsfFacetVersion == null )
{
jsfFacetVersion = jsfFacet.getVersion( JSF_FACET_SUPPORTED_VERSION );
facetedProject.addProjectFacet( jsfFacetVersion );
}
Action action = facetedProject.getProjectFacetAction( jsfFacet );
IDataModel jsfFacetDataModel = (IDataModel) action.getConfig();
//TODO IDE-648 IDE-110
jsfFacetDataModel.setProperty( SERVLET_URL_PATTERNS, null );
jsfFacetDataModel.setProperty( WEBCONTENT_DIR, ISDKConstants.DEFAULT_DOCROOT_FOLDER );
LibraryInstallDelegate libraryInstallDelegate =
(LibraryInstallDelegate) jsfFacetDataModel.getProperty( LIBRARY_PROVIDER_DELEGATE );
List<ILibraryProvider> providers = libraryInstallDelegate.getLibraryProviders();
ILibraryProvider noOpProvider = null;
for( ILibraryProvider provider : providers )
{
if( provider.getId().equals( "jsf-no-op-library-provider" ) ) //$NON-NLS-1$
{
noOpProvider = provider;
break;
}
}
if( noOpProvider != null )
{
libraryInstallDelegate.setLibraryProvider( noOpProvider );
}
return Status.OK_STATUS;
}
@Override
public IProjectFacet[] getFacets()
{
return new IProjectFacet[] { PortletCore.JSF_FACET };
}
protected IProjectFacetVersion getJSFProjectFacet( IFacetedProjectWorkingCopy project )
{
Set<IProjectFacetVersion> facets = project.getProjectFacets();
for( IProjectFacetVersion facet : facets )
{
if( facet.getProjectFacet().getId().equals( IJSFCoreConstants.JSF_CORE_FACET_ID ) )
{
return facet;
}
}
return null;
}
//TODO add support for maven projects
//TODO IDE-1334 check the web.xml for jsf frameworks.
@Override
public IStatus postProjectCreated( IProject project, String frameworkName, String portletName, IProgressMonitor monitor )
{
/*
* we need to copy the original web.xml from the project template because of bugs in the JSF facet installer
* will overwrite our web.xml that comes with in the template
*/
super.postProjectCreated( project, frameworkName, portletName, monitor );
SDK sdk = SDKUtil.getSDK( project );
if( sdk != null )
{
try
{
//TODO IDE-648
File originalWebXmlFile =
sdk.getLocation().append( "tools/portlet_" + frameworkName + "_tmpl/docroot/WEB-INF/web.xml" ).toFile(); //$NON-NLS-1$
if( originalWebXmlFile.exists() )
{
final IWebProject webproject = LiferayCore.create( IWebProject.class, project );
if( webproject != null )
{
IFolder defaultDocroot = webproject.getDefaultDocrootFolder();
defaultDocroot.getFile( "WEB-INF/web.xml" ).setContents(
new FileInputStream( originalWebXmlFile ), IResource.FORCE, null );
}
}
}
catch( Exception e )
{
return PortletCore.createErrorStatus( "Could not copy original web.xml from JSF template in SDK.", e ); //$NON-NLS-1$
}
}
try
{
IFolder docroot = CoreUtil.getDefaultDocrootFolder( project );
IFolder views = docroot.getFolder( "views" );
if( views.exists() )
{
views.move( docroot.getFolder( "WEB-INF/views" ).getFullPath(), true, monitor );
IFile portletXml = docroot.getFile( "WEB-INF/portlet.xml" );
File portletXmlFile = portletXml.getLocation().toFile();
String contents = FileUtil.readContents( portletXmlFile, true );
if( contents.contains( "init-param" ) )
{
contents = contents.replaceAll( "/views/view.xhtml", "/WEB-INF/views/view.xhtml" );
portletXml.setContents(
new ByteArrayInputStream( contents.getBytes( "UTF-8" ) ), IResource.FORCE, null );
}
}
}
catch( Exception e )
{
return PortletCore.createErrorStatus( e );
}
return Status.OK_STATUS;
}
public boolean supports( ILiferayProjectProvider provider )
{
return provider != null &&
( "ant".equals( provider.getShortName() ) || "maven".equals( provider.getShortName() ) );
}
}