/******************************************************************************* * 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 ); } } }