/*******************************************************************************
* 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.hook.ui.editor;
import static com.liferay.ide.core.util.CoreUtil.empty;
import com.liferay.ide.core.ILiferayPortal;
import com.liferay.ide.core.ILiferayProject;
import com.liferay.ide.core.IWebProject;
import com.liferay.ide.core.LiferayCore;
import com.liferay.ide.core.util.CoreUtil;
import com.liferay.ide.hook.core.model.CustomJsp;
import com.liferay.ide.hook.core.model.CustomJspDir;
import com.liferay.ide.hook.core.model.Hook;
import com.liferay.ide.hook.core.model.Hook6xx;
import com.liferay.ide.hook.core.util.HookUtil;
import com.liferay.ide.hook.ui.HookUI;
import com.liferay.ide.ui.util.UIUtil;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.resources.WorkspaceJob;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.osgi.util.NLS;
import org.eclipse.sapphire.Element;
import org.eclipse.sapphire.ElementHandle;
import org.eclipse.sapphire.ElementList;
import org.eclipse.sapphire.FilteredListener;
import org.eclipse.sapphire.Listener;
import org.eclipse.sapphire.PropertyContentEvent;
import org.eclipse.sapphire.Value;
import org.eclipse.sapphire.modeling.Path;
import org.eclipse.sapphire.ui.swt.xml.editor.SapphireEditorForXml;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IStorageEditorInput;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.ide.FileStoreEditorInput;
import org.eclipse.ui.part.FileEditorInput;
/**
* @author Kamesh Sampath
* @author Gregory Amerson
* @author Simon Jiang
*/
public class HookXmlEditor extends SapphireEditorForXml
{
protected boolean customModelDirty = false;
private boolean ignoreCustomModelChanges;
public HookXmlEditor()
{
super( Hook6xx.TYPE, null );
}
@Override
protected void adaptModel( final Element model )
{
super.adaptModel( model );
Listener listener = new FilteredListener<PropertyContentEvent>()
{
@Override
public void handleTypedEvent( final PropertyContentEvent event )
{
handleCustomJspsPropertyChangedEvent( event );
}
};
this.ignoreCustomModelChanges = true;
model.attach( listener, Hook.PROP_CUSTOM_JSPS.name() + "/*" ); //$NON-NLS-1$
this.ignoreCustomModelChanges = false;
}
@Override
protected void createFormPages() throws PartInitException
{
addDeferredPage( 1, "Overview", "HookConfigurationPage" );
}
private void configureCustomJspValidation( final IProject project, final String customerJspPath )
{
final IFolder docFolder = CoreUtil.getDefaultDocrootFolder( project );
if( docFolder != null )
{
final IPath newPath = org.eclipse.core.runtime.Path.fromOSString( customerJspPath );
final IPath pathValue = docFolder.getFullPath().append( newPath );
final IFolder customJspFolder = project.getFolder( pathValue.makeRelativeTo( project.getFullPath() ) );
boolean needAddCustomJspValidation =
HookUtil.configureJSPSyntaxValidationExclude( project, customJspFolder, false );
if( !needAddCustomJspValidation )
{
UIUtil.async( new Runnable()
{
public void run()
{
final boolean addDisableCustomJspValidation =
MessageDialog.openQuestion(
UIUtil.getActiveShell(), Msgs.disableCustomValidationTitle,
Msgs.disableCustomValidationMsg );
if( addDisableCustomJspValidation )
{
new WorkspaceJob( " disable custom jsp validation for " + project.getName() )
{
@Override
public IStatus runInWorkspace( IProgressMonitor monitor ) throws CoreException
{
HookUtil.configureJSPSyntaxValidationExclude(
project, customJspFolder, true );
project.build( IncrementalProjectBuilder.FULL_BUILD, new NullProgressMonitor() );
return Status.OK_STATUS;
}
}.schedule();
}
}
} );
}
}
}
private void copyCustomJspsToProject( IPath portalDir, ElementList<CustomJsp> customJsps )
{
try
{
CustomJspDir customJspDirElement = this.getModelElement().nearest( Hook.class ).getCustomJspDir().content();
if( customJspDirElement != null && customJspDirElement.validation().ok() )
{
Path customJspDir = customJspDirElement.getValue().content();
final IWebProject webproject = LiferayCore.create( IWebProject.class, getProject() );
if( webproject != null )
{
IFolder defaultDocroot = webproject.getDefaultDocrootFolder();
IFolder customJspFolder = defaultDocroot.getFolder( customJspDir.toPortableString() );
for( CustomJsp customJsp : customJsps )
{
String content = customJsp.getValue().content();
if( !empty( content ) )
{
IFile customJspFile = customJspFolder.getFile( content );
if( !customJspFile.exists() )
{
IPath portalJsp = portalDir.append( content );
try
{
CoreUtil.makeFolders( (IFolder) customJspFile.getParent() );
if( portalJsp.toFile().exists() )
{
customJspFile.create(
new FileInputStream( portalJsp.toFile() ), true, null );
}
else
{
CoreUtil.createEmptyFile( customJspFile );
}
}
catch( Exception e )
{
HookUI.logError( e );
}
}
}
}
}
}
}
catch( Exception e )
{
HookUI.logError( e );
}
}
@Override
public void doSave( IProgressMonitor monitor )
{
if( this.customModelDirty )
{
final Hook hook = getModelElement().nearest( Hook.class );
final ElementList<CustomJsp> customJsps = hook.getCustomJsps();
final ILiferayProject liferayProject = LiferayCore.create( getProject() );
final ILiferayPortal portal = liferayProject.adapt( ILiferayPortal.class );
if( portal != null )
{
final IPath portalDir = portal.getAppServerPortalDir();
if( portalDir != null )
{
copyCustomJspsToProject( portalDir, customJsps );
}
}
this.customModelDirty = false;
super.doSave( monitor );
this.firePropertyChange( IEditorPart.PROP_DIRTY );
ElementHandle<CustomJspDir> customJspDir = hook.getCustomJspDir();
if( customJspDir != null && !customJspDir.empty() )
{
Value<Path> customJspPath = customJspDir.content().getValue();
final String customeJspValue = customJspPath.content().makeRelative().toPortableString();
configureCustomJspValidation( getProject(), customeJspValue );
}
}
else
{
super.doSave( monitor );
}
}
public InputStream getFileContents() throws CoreException, MalformedURLException, IOException
{
final IEditorInput editorInput = getEditorInput();
if( editorInput instanceof FileEditorInput )
{
return ( (FileEditorInput) editorInput ).getFile().getContents();
}
else if( editorInput instanceof IStorageEditorInput )
{
return ( (IStorageEditorInput) editorInput ).getStorage().getContents();
}
else if( editorInput instanceof FileStoreEditorInput )
{
return ( (FileStoreEditorInput) editorInput ).getURI().toURL().openStream();
}
else
{
return null;
}
}
protected void handleCustomJspsPropertyChangedEvent( final PropertyContentEvent event )
{
if( this.ignoreCustomModelChanges )
{
return;
}
this.customModelDirty = true;
this.firePropertyChange( IEditorPart.PROP_DIRTY );
}
@Override
public boolean isDirty()
{
if( this.customModelDirty )
{
return true;
}
return super.isDirty();
}
@Override
protected void pageChange( int pageIndex )
{
this.ignoreCustomModelChanges = true;
super.pageChange( pageIndex );
this.ignoreCustomModelChanges = false;
}
private static class Msgs extends NLS
{
public static String disableCustomValidationMsg;
public static String disableCustomValidationTitle;
static
{
initializeMessages( HookXmlEditor.class.getName(), Msgs.class );
}
}
}