/*******************************************************************************
* 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.core.util;
import com.liferay.ide.core.templates.ITemplateContext;
import com.liferay.ide.core.templates.ITemplateOperation;
import com.liferay.ide.core.templates.TemplatesCore;
import com.liferay.ide.core.util.CoreUtil;
import com.liferay.ide.layouttpl.core.LayoutTplCore;
import com.liferay.ide.layouttpl.core.model.LayoutTplElement;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.collections.ArrayStack;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
* @author Gregory Amerson
* @author Cindy Li
* @author Kuo Zhang
* @author Joye Luo
*/
@SuppressWarnings( "restriction" )
public class LayoutTplUtil
{
private static void createLayoutTplContext( ITemplateOperation op, LayoutTplElement layouttpl )
{
final ITemplateContext ctx = op.getContext();
ctx.put( "root", layouttpl );
ctx.put( "stack", new ArrayStack() );
}
public static IDOMElement[] findChildElementsByClassName( IDOMElement parentElement,
String childElementTag,
String className )
{
if( parentElement == null || !( parentElement.hasChildNodes() ) )
{
return null;
}
List<IDOMElement> childElements = new ArrayList<IDOMElement>();
List<Element> divChildren = getChildElementsByTagName( parentElement, childElementTag );
for( int i = 0; i < divChildren.size(); i++ )
{
IDOMElement childDivElement = (IDOMElement) divChildren.get( i );
if( hasClassName( childDivElement, className ) )
{
childElements.add( childDivElement );
}
}
return childElements.toArray( new IDOMElement[0] );
}
public static IDOMElement findMainContentElement( IDOMDocument rootDocument )
{
if( rootDocument == null || !( rootDocument.hasChildNodes() ) )
{
return null;
}
IDOMElement mainContentElement = null;
mainContentElement = (IDOMElement) rootDocument.getElementById( "main-content" ); //$NON-NLS-1$
return mainContentElement;
}
public static List<Element> getChildElementsByTagName( IDOMElement parentElement, String childElementTag )
{
final NodeList childNodes = ( (Node) parentElement ).getChildNodes();
List<Element> childElements = new ArrayList<Element>();
for( int i = 0; i < childNodes.getLength(); i++)
{
Node childNode = childNodes.item( i );
if( childNode.getNodeType() == 1 && childElementTag != null )
{
Element element = (Element) childNode;
if( element.getTagName().equals( childElementTag ) )
{
childElements.add( element );
}
}
}
return childElements;
}
public static String getRoleValue( IDOMElement mainContentElement, String defaultValue )
{
String retval = defaultValue;
String currentRoleValue = mainContentElement.getAttribute( "role" ); //$NON-NLS-1$
if( !CoreUtil.isNullOrEmpty( currentRoleValue ) )
{
retval = currentRoleValue;
}
return retval;
}
public static String getTemplateSource( LayoutTplElement layouttpl )
{
final StringBuffer buffer = new StringBuffer();
try
{
ITemplateOperation templateOperation = null;
if( layouttpl.getBootstrapStyle().content() )
{
templateOperation =
TemplatesCore.getTemplateOperation( "com.liferay.ide.layouttpl.core.layoutTemplate.bootstrap" );
}
else
{
templateOperation =
TemplatesCore.getTemplateOperation( "com.liferay.ide.layouttpl.core.layoutTemplate.legacy" );
}
createLayoutTplContext( templateOperation, layouttpl );
templateOperation.setOutputBuffer( buffer );
templateOperation.execute( new NullProgressMonitor() );
}
catch( Exception ex )
{
LayoutTplCore.logError( "Error getting template source.", ex ); //$NON-NLS-1$
}
return buffer.toString();
}
public static int getWeightValue( IDOMElement portletColumnElement, int defaultValue )
{
int weightValue = defaultValue;
if( portletColumnElement == null )
{
return weightValue;
}
String classAttr = portletColumnElement.getAttribute( "class" ); //$NON-NLS-1$
if( CoreUtil.isNullOrEmpty( classAttr ) )
{
return weightValue;
}
// resolve column weight of bootstrap style, portal version equal to 62
Matcher matcher = Pattern.compile( "(.*span)(\\d+)" ).matcher( classAttr );
if( matcher.matches() )
{
String weightString = matcher.group( 2 );
if( !CoreUtil.isNullOrEmpty( weightString ) )
{
try
{
weightValue = Integer.parseInt( weightString );
}
catch( NumberFormatException ex )
{
weightValue = 0;
}
}
}
else
{
matcher = Pattern.compile( ".*col-(xs|sm|md|lg)-(\\d+).*" ).matcher( classAttr );
if( matcher.matches() )
{
String weightString = matcher.group( 2 );
if( !CoreUtil.isNullOrEmpty( weightString ) )
{
try
{
weightValue = Integer.parseInt( weightString );
}
catch( NumberFormatException ex )
{
weightValue = 0;
}
}
}
}
return weightValue;
}
public static boolean hasClassName( IDOMElement domElement, String className )
{
boolean retval = false;
if( domElement != null )
{
String classAttr = domElement.getAttribute( "class" ); //$NON-NLS-1$
if( !CoreUtil.isNullOrEmpty( classAttr ) )
{
retval = classAttr.contains( className );
}
}
return retval;
}
public static void saveToFile( LayoutTplElement diagramElement, IFile file, IProgressMonitor monitor )
{
try
{
ITemplateOperation op = null;
if( diagramElement.getBootstrapStyle().content() )
{
op = TemplatesCore.getTemplateOperation( "com.liferay.ide.layouttpl.core.layoutTemplate.bootstrap" );
}
else
{
op = TemplatesCore.getTemplateOperation( "com.liferay.ide.layouttpl.core.layoutTemplate.legacy" );
}
createLayoutTplContext( op, diagramElement );
op.setOutputFile( file );
op.execute( monitor );
}
catch( Exception e )
{
LayoutTplCore.logError( e );
}
}
}