/******************************************************************************* * 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.theme.core; import com.liferay.ide.core.ILiferayConstants; 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.core.util.StringPool; import com.liferay.ide.project.core.util.ProjectUtil; import com.liferay.ide.sdk.core.ISDKConstants; import com.liferay.ide.sdk.core.SDK; import com.liferay.ide.sdk.core.SDKUtil; import com.liferay.ide.theme.core.operation.ThemeDescriptorHelper; import java.io.IOException; import java.util.Properties; 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.resources.IResourceChangeEvent; import org.eclipse.core.resources.IResourceChangeListener; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.resources.IResourceDeltaVisitor; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; 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.Path; import org.eclipse.core.runtime.Status; import org.eclipse.osgi.util.NLS; /** * @author Greg Amerson * @author Cindy Li */ public class ThemeDiffResourceListener implements IResourceChangeListener { public void resourceChanged( IResourceChangeEvent event ) { if( event == null ) { return; } if( shouldProcessResourceChangedEvent( event ) ) { IResourceDelta delta = event.getDelta(); try { delta.accept( new IResourceDeltaVisitor() { public boolean visit( IResourceDelta delta ) throws CoreException { if( shouldProcessResourceDelta( delta ) ) { processResourceChanged( delta ); return false; } return true; } } ); } catch( CoreException e ) { } } } private IFile getWorkspaceFile( IPath path ) { IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); return root.getFile( path ); } protected boolean isLiferayPluginProject( IPath deltaPath ) { IFile pluginPackagePropertiesFile = getWorkspaceFile( deltaPath ); if( pluginPackagePropertiesFile != null && pluginPackagePropertiesFile.exists() ) { return ProjectUtil.isThemeProject( pluginPackagePropertiesFile.getProject() ); } return false; } protected void processResourceChanged( final IResourceDelta delta ) throws CoreException { new WorkspaceJob( Msgs.compilingTheme ) { @Override public IStatus runInWorkspace( IProgressMonitor monitor ) throws CoreException { IProject project = delta.getResource().getProject(); SDK sdk = SDKUtil.getSDK( project ); if( sdk == null ) { throw new CoreException( ThemeCore.createErrorStatus( "No SDK for project configured. Could not deploy theme module" ) ); //$NON-NLS-1$ } IStatus status = sdk.compileThemePlugin( project, null ); if( !status.isOK() ) { throw new CoreException( status ); } final IWebProject webproject = LiferayCore.create( IWebProject.class, project ); if( webproject == null ) { return status; } // IDE-110 IDE-648 final IResource res = webproject.findDocrootResource( new Path( "WEB-INF/" + ILiferayConstants.LIFERAY_LOOK_AND_FEEL_XML_FILE ) ); IFile lookAndFeelFile = null; if( res != null && res.exists() ) { lookAndFeelFile = (IFile) res; } if( lookAndFeelFile == null ) { String id = project.getName().replaceAll( ISDKConstants.THEME_PLUGIN_PROJECT_SUFFIX, StringPool.EMPTY ); final IResource propsRes = webproject.findDocrootResource( new Path( "WEB-INF/" + ILiferayConstants.LIFERAY_PLUGIN_PACKAGE_PROPERTIES_FILE ) ); String name = id; if( propsRes instanceof IFile && propsRes.exists() ) { Properties props = new Properties(); try { props.load( ( (IFile) propsRes).getContents() ); String nameValue = props.getProperty( "name" ); //$NON-NLS-1$ if( !CoreUtil.isNullOrEmpty( nameValue ) ) { name = nameValue; } } catch( IOException e ) { ThemeCore.logError( "Unable to load plugin package properties.", e ); //$NON-NLS-1$ } } final ThemeDescriptorHelper themeDescriptorHelper = new ThemeDescriptorHelper( project ); final ILiferayProject lProject = LiferayCore.create( project ); final String type = lProject.getProperty( "theme.type", "vm" ); String version = "6.2.0"; final ILiferayPortal portal = lProject.adapt( ILiferayPortal.class ); if( portal != null ) { version = portal.getVersion(); } themeDescriptorHelper.createDefaultFile( webproject.getDefaultDocrootFolder(), version, id, name, type ); try { webproject.getDefaultDocrootFolder().refreshLocal( IResource.DEPTH_INFINITE, null ); } catch( Exception e ) { ThemeCore.logError( e ); } } return Status.OK_STATUS; } }.schedule(); } protected boolean shouldProcessResourceChangedEvent( IResourceChangeEvent event ) { if( event == null ) { return false; } IResourceDelta delta = event.getDelta(); int deltaKind = delta.getKind(); if( deltaKind == IResourceDelta.REMOVED || deltaKind == IResourceDelta.REMOVED_PHANTOM ) { return false; } return true; } protected boolean shouldProcessResourceDelta( IResourceDelta delta ) { IPath fullPath = delta.getFullPath(); // IDE-110 IDE-648 final IWebProject webproject = LiferayCore.create( IWebProject.class, delta.getResource().getProject() ); if( webproject == null || webproject.getDefaultDocrootFolder() == null ) { return false; } final IFolder webappRoot = webproject.getDefaultDocrootFolder(); final IPath diffPath = webappRoot.getFolder( new Path( "_diffs" ) ).getFullPath(); return diffPath.isPrefixOf( fullPath ); } private static class Msgs extends NLS { public static String compilingTheme; static { initializeMessages( ThemeDiffResourceListener.class.getName(), Msgs.class ); } } }