package com.liferay.ide.core.templates;
import com.liferay.ide.core.LiferayCore;
import freemarker.template.Configuration;
import freemarker.template.ObjectWrapper;
import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
import org.eclipse.core.runtime.Platform;
import org.osgi.framework.Bundle;
/**
* The activator class controls the plugin life cycle
*/
public class TemplatesCore
{
// The shared instance
private static TemplatesCore plugin;
private static Map<String, TemplateModel> templateModels = new HashMap<String, TemplateModel>();
private static IConfigurationElement[] tplDefinitionElements;
/**
* Returns the shared instance
*
* @return the shared instance
*/
public static TemplatesCore getDefault()
{
return plugin;
}
public static ITemplateOperation getTemplateOperation( String templateId )
{
// look up the template
// find the plugin
// if it doesn't have an engine for that plugin, then create one
// then load the template with default context
TemplateModel model = getTemplateModel( templateId );
return new TemplateOperation( model );
}
private static TemplateModel createTemplateModel( IConfigurationElement element, String pluginName )
{
TemplateModel templateModel = null;
try
{
String id = element.getAttribute( "id" ); //$NON-NLS-1$
String resource = element.getAttribute( "resource" ); //$NON-NLS-1$
String templateFolder = null;
List<TemplateVariable> paramList = new ArrayList<TemplateVariable>();
IConfigurationElement[] items = ( (IExtension) element.getParent() ).getConfigurationElements();
for( IConfigurationElement item : items )
{
if( "templatesFolder".equals( item.getName() ) ) //$NON-NLS-1$
{
templateFolder = item.getAttribute( "path" ); //$NON-NLS-1$
}
if( "templateVariable".equals( item.getName() ) ) //$NON-NLS-1$
{
String paramName = item.getAttribute( "name" ); //$NON-NLS-1$
String reqVal = item.getAttribute( "required" ); //$NON-NLS-1$
paramList.add( new TemplateVariable( paramName, reqVal ) );
}
}
final Configuration config = new Configuration();
final TemplateVariable[] vars = paramList.toArray( new TemplateVariable[0] );
templateModel = new TemplateModel( pluginName,
config,
id,
resource,
templateFolder,
vars );
}
catch( Exception e )
{
LiferayCore.logError( e );
}
return templateModel;
}
private static TemplateModel getTemplateModel( String templateId )
{
if( templateId == null )
{
return null;
}
TemplateModel model = templateModels.get( templateId );
if( model == null )
{
final IConfigurationElement element = getTplDefinitionElement( templateId );
final String pluginName = element.getContributor().getName();
model = createTemplateModel( element, pluginName );
try
{
initializeModel( model );
}
catch( Exception e )
{
LiferayCore.logError( e );
model = null;
}
if( model != null )
{
templateModels.put( templateId, model );
}
}
return model;
}
private static IConfigurationElement getTplDefinitionElement( String templateId )
{
if( templateId == null )
{
return null;
}
final IConfigurationElement[] elements = getTplDefinitionElements();
for( IConfigurationElement element : elements )
{
if( "template".equals( element.getName() ) ) //$NON-NLS-1$
{
if( templateId.equals( element.getAttribute( "id" ) ) ) //$NON-NLS-1$
{
return element;
}
}
}
return null;
}
private static IConfigurationElement[] getTplDefinitionElements()
{
if( tplDefinitionElements == null )
{
tplDefinitionElements =
Platform.getExtensionRegistry().getConfigurationElementsFor( LiferayCore.PLUGIN_ID + ".templateDefinitions" );
}
return tplDefinitionElements;
}
private static void initializeModel( TemplateModel templateModel ) throws Exception
{
final Configuration config = templateModel.getConfig();
final String bundleId = templateModel.getBundleId();
final Bundle bundle = Platform.getBundle( bundleId );
if( bundle == null )
{
LiferayCore.logError( "Could not initialize template model: could not find bundle " + bundleId ); //$NON-NLS-1$
}
final URL loaderRoot = bundle.getEntry( templateModel.getTemplateFolder() );
final URL fileUrl = FileLocator.toFileURL( loaderRoot );
config.setDirectoryForTemplateLoading( new File( fileUrl.getFile().toString() ) );
config.setObjectWrapper( ObjectWrapper.BEANS_WRAPPER );
templateModel.setConfig( config );
}
/**
* The constructor
*/
private TemplatesCore()
{
}
}