/*******************************************************************************
* 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.layouttpl.ui.wizard;
import com.liferay.ide.core.ILiferayConstants;
import com.liferay.ide.core.ILiferayPortal;
import com.liferay.ide.core.ILiferayProject;
import com.liferay.ide.core.LiferayCore;
import com.liferay.ide.core.util.CoreUtil;
import com.liferay.ide.core.util.StringPool;
import com.liferay.ide.layouttpl.core.model.LayoutTplElement;
import com.liferay.ide.layouttpl.core.operation.INewLayoutTplDataModelProperties;
import com.liferay.ide.layouttpl.core.operation.LayoutTplDescriptorHelper;
import com.liferay.ide.layouttpl.core.util.LayoutTplUtil;
import com.liferay.ide.layouttpl.ui.LayoutTplUI;
import com.liferay.ide.layouttpl.ui.util.LayoutTemplatesFactory;
import com.liferay.ide.project.core.util.ProjectUtil;
import com.liferay.ide.project.ui.wizard.LiferayDataModelOperation;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.net.URL;
import org.eclipse.core.commands.ExecutionException;
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.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jface.text.templates.TemplateContextType;
import org.eclipse.jface.text.templates.persistence.TemplateStore;
import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
import org.osgi.framework.Version;
/**
* @author Gregory Amerson
* @author Cindy Li
* @author Kuo Zhang
*/
@SuppressWarnings( "restriction" )
public class AddLayoutTplOperation extends LiferayDataModelOperation implements INewLayoutTplDataModelProperties
{
public AddLayoutTplOperation( IDataModel model, TemplateStore templateStore, TemplateContextType contextType )
{
super( model, templateStore, contextType );
}
@Override
public IStatus execute( IProgressMonitor monitor, IAdaptable info ) throws ExecutionException
{
IStatus retval = null;
IDataModel dm = getDataModel();
String diagramClassName = dm.getStringProperty( LAYOUT_TEMPLATE_ID );
LayoutTplElement diagramModel = createLayoutTplDigram( dm, isBootstrapStyle(), diagramClassName );
try
{
IFile templateFile = null;
String templateFileName = getDataModel().getStringProperty( LAYOUT_TEMPLATE_FILE );
if( !CoreUtil.isNullOrEmpty( templateFileName ) )
{
templateFile = createTemplateFile( templateFileName, diagramModel );
}
getDataModel().setProperty( LAYOUT_TPL_FILE_CREATED, templateFile );
String wapTemplateFileName = getDataModel().getStringProperty( LAYOUT_WAP_TEMPLATE_FILE );
diagramModel.setClassName( diagramClassName + ".wap" );
if( !CoreUtil.isNullOrEmpty( wapTemplateFileName ) )
{
createTemplateFile( wapTemplateFileName, diagramModel );
}
String thumbnailFileName = getDataModel().getStringProperty( LAYOUT_THUMBNAIL_FILE );
if( !CoreUtil.isNullOrEmpty( thumbnailFileName ) )
{
createThumbnailFile( thumbnailFileName );
}
}
catch( CoreException ex )
{
LayoutTplUI.logError( ex );
return LayoutTplUI.createErrorStatus( ex );
}
catch( IOException ex )
{
LayoutTplUI.logError( ex );
return LayoutTplUI.createErrorStatus( ex );
}
LayoutTplDescriptorHelper layoutTplDescHelper = new LayoutTplDescriptorHelper( getTargetProject() );
retval = layoutTplDescHelper.addNewLayoutTemplate( dm );
return retval;
}
protected void createThumbnailFile( String thumbnailFileName )
throws CoreException, IOException
{
IFolder defaultDocroot = CoreUtil.getDefaultDocrootFolder( getTargetProject() );
IFile thumbnailFile = defaultDocroot.getFile( thumbnailFileName );
URL iconFileURL = LayoutTplUI.getDefault().getBundle().getEntry( "/icons/blank_columns.png" ); //$NON-NLS-1$
CoreUtil.prepareFolder( (IFolder) thumbnailFile.getParent() );
if( thumbnailFile.exists() )
{
thumbnailFile.setContents( iconFileURL.openStream(), IResource.FORCE, null );
}
else
{
thumbnailFile.create( iconFileURL.openStream(), true, null );
}
}
protected IFile createTemplateFile( String templateFileName, LayoutTplElement element ) throws CoreException
{
IFolder defaultDocroot = CoreUtil.getDefaultDocrootFolder( getTargetProject() );
IFile templateFile = defaultDocroot.getFile( templateFileName );
if( element != null )
{
LayoutTplUtil.saveToFile( element, templateFile, null );
}
else
{
ByteArrayInputStream input = new ByteArrayInputStream( StringPool.EMPTY.getBytes() );
if( templateFile.exists() )
{
templateFile.setContents( input, IResource.FORCE, null );
}
else
{
templateFile.create( input, true, null );
}
}
return templateFile;
}
protected LayoutTplElement createLayoutTplDigram( IDataModel dm, boolean isBootstrapStyle, String className )
{
LayoutTplElement layoutTpl = LayoutTplElement.TYPE.instantiate();
layoutTpl.setBootstrapStyle( isBootstrapStyle );
layoutTpl.setClassName( className );
if( dm.getBooleanProperty( LAYOUT_IMAGE_1_COLUMN ) )
{
LayoutTemplatesFactory.add_Layout_1( layoutTpl );
}
else if( dm.getBooleanProperty( LAYOUT_IMAGE_1_2_I_COLUMN ) )
{
LayoutTemplatesFactory.add_Layout_1_2_I( layoutTpl );
}
else if( dm.getBooleanProperty( LAYOUT_IMAGE_1_2_II_COLUMN ) )
{
LayoutTemplatesFactory.add_Layout_1_2_II( layoutTpl );
}
else if( dm.getBooleanProperty( LAYOUT_IMAGE_1_2_1_COLUMN ) )
{
LayoutTemplatesFactory.add_Layout_1_2_1( layoutTpl );
}
else if( dm.getBooleanProperty( LAYOUT_IMAGE_2_I_COLUMN ) )
{
LayoutTemplatesFactory.add_Layout_2_I( layoutTpl );
}
else if( dm.getBooleanProperty( LAYOUT_IMAGE_2_II_COLUMN ) )
{
LayoutTemplatesFactory.add_Layout_2_II( layoutTpl );
}
else if( dm.getBooleanProperty( LAYOUT_IMAGE_2_III_COLUMN ) )
{
LayoutTemplatesFactory.add_Layout_2_III( layoutTpl );
}
else if( dm.getBooleanProperty( LAYOUT_IMAGE_2_2_COLUMN ) )
{
LayoutTemplatesFactory.add_Layout_2_2( layoutTpl );
}
else if( dm.getBooleanProperty( LAYOUT_IMAGE_3_COLUMN ) )
{
LayoutTemplatesFactory.add_Layout_3( layoutTpl );
}
return layoutTpl;
}
public IProject getTargetProject()
{
String projectName = model.getStringProperty( PROJECT_NAME );
return ProjectUtil.getProject( projectName );
}
private boolean isBootstrapStyle()
{
final ILiferayProject lrproject = LiferayCore.create( getTargetProject() );
final ILiferayPortal portal = lrproject.adapt( ILiferayPortal.class );
if( portal != null )
{
final Version version = new Version( portal.getVersion() );
return CoreUtil.compareVersions( version, ILiferayConstants.V620 ) >= 0 ;
}
return true;
}
}