/*******************************************************************************
* 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.ui;
import com.liferay.ide.core.util.CoreUtil;
import com.liferay.ide.core.util.FileUtil;
import com.liferay.ide.sdk.core.SDK;
import com.liferay.ide.sdk.core.SDKUtil;
import com.liferay.ide.ui.templates.ServiceClassNameResolver;
import com.liferay.ide.ui.util.UIUtil;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
import java.lang.management.ManagementFactory;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.resources.WorkspaceJob;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.IScopeContext;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.internal.formatter.DefaultCodeFormatterOptions;
import org.eclipse.jdt.internal.ui.JavaPlugin;
import org.eclipse.jdt.internal.ui.preferences.PreferencesAccess;
import org.eclipse.jdt.internal.ui.preferences.formatter.FormatterProfileStore;
import org.eclipse.jdt.internal.ui.preferences.formatter.ProfileManager.CustomProfile;
import org.eclipse.jdt.internal.ui.preferences.formatter.ProfileManager.Profile;
import org.eclipse.jdt.internal.ui.preferences.formatter.ProfileVersioner;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.ImageRegistry;
import org.eclipse.jface.text.templates.ContextTypeRegistry;
import org.eclipse.jface.text.templates.TemplateContextType;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TaskBar;
import org.eclipse.swt.widgets.TaskItem;
import org.eclipse.ui.IStartup;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.editors.text.TextFileDocumentProvider;
import org.eclipse.ui.plugin.AbstractUIPlugin;
import org.eclipse.ui.texteditor.IDocumentProvider;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceEvent;
import org.osgi.framework.ServiceListener;
import org.osgi.service.prefs.BackingStoreException;
/**
* The activator class controls the plugin life cycle
*
* @author Greg Amerson
*/
@SuppressWarnings( { "restriction", "deprecation" } )
public class LiferayUIPlugin extends AbstractUIPlugin implements IStartup
{
public static final String FIRST_STARTUP_COMPLETE = "FIRST_STARTUP_COMPLETE"; //$NON-NLS-1$
public static final String IMG_LIFERAY_ICON_SMALL = "IMG_LIFERAY_ICON_SMALL"; //$NON-NLS-1$
// The plugin ID
public static final String PLUGIN_ID = "com.liferay.ide.ui"; //$NON-NLS-1$
// The shared instance
private static LiferayUIPlugin plugin;
private ServiceListener serviceListener;
public static void clearAllPersistentSettings() throws BackingStoreException
{
IEclipsePreferences tomcatCorePrefs = new InstanceScope().getNode( "com.liferay.ide.server.tomcat.core" ); //$NON-NLS-1$
tomcatCorePrefs.remove( "ADDED_EXT_PLUGIN_TOGGLE_KEY" ); //$NON-NLS-1$
tomcatCorePrefs.remove( "ADDED_EXT_PLUGIN_WITHOUT_ZIP_TOGGLE_KEY" ); //$NON-NLS-1$
tomcatCorePrefs.remove( "REMOVE_EXT_PLUGIN_TOGGLE_KEY" ); //$NON-NLS-1$
tomcatCorePrefs.flush();
}
public static IStatus createErrorStatus( String string )
{
return new Status( IStatus.ERROR, PLUGIN_ID, string );
}
public static void logError( String msg, Exception e )
{
getDefault().getLog().log(new Status(IStatus.ERROR, PLUGIN_ID, msg, e));
}
public static IWorkbenchPage getActivePage()
{
return PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
}
/**
* Returns the shared instance
*
* @return the shared instance
*/
public static LiferayUIPlugin getDefault()
{
return plugin;
}
@SuppressWarnings( { "rawtypes", "unchecked" } )
public static Map getLiferaySettings()
{
final Map options = new DefaultCodeFormatterOptions( LiferayDefaultCodeFormatterSettings.settings ).getMap();
ProfileVersioner.setLatestCompliance( options );
return options;
}
public static IWorkspace getWorkspace()
{
return ResourcesPlugin.getWorkspace();
}
public static void logError(Exception e)
{
logError( e.getMessage(), e );
}
protected TextFileDocumentProvider fTextFileDocumentProvider;
protected Map<String, ImageDescriptor> imageDescriptors = new HashMap<String, ImageDescriptor>();
/**
* The constructor
*/
public LiferayUIPlugin()
{
}
private void applyWorkspaceBadge()
{
final String workspaceName = CoreUtil.getWorkspaceRoot().getLocation().lastSegment();
UIUtil.async( new Runnable()
{
public void run()
{
try
{
final Display display = Display.getDefault();
final Shell shell = display.getActiveShell();
final TaskBar taskBar = display.getSystemTaskBar();
TaskItem taskItem = taskBar.getItem(shell);
if( taskItem == null)
{
taskItem = taskBar.getItem(null);
}
taskItem.setOverlayText( workspaceName );
}
catch( Exception e )
{
//ignore
}
}
});
}
public void earlyStartup()
{
if( isFirstStartup() )
{
installLiferayFormatterProfile();
firstStartupComplete();
}
registerMBeans();
lookupLiferay7SDKDir();
applyWorkspaceBadge();
registerResolvers();
}
private void lookupLiferay7SDKDir()
{
String liferay7SDKdir = System.getProperty( "liferay7.sdk.dir" );
if( liferay7SDKdir != null && liferay7SDKdir.startsWith( "\"" ) )
{
liferay7SDKdir = liferay7SDKdir.substring( 1 );
}
if( liferay7SDKdir != null && liferay7SDKdir.endsWith( "\"" ) )
{
liferay7SDKdir = liferay7SDKdir.substring( 0, liferay7SDKdir.length() - 1 );
}
if( liferay7SDKdir != null )
{
final SDK sdk = SDKUtil.createSDKFromLocation( new Path( liferay7SDKdir ) );
if( sdk != null )
{
new WorkspaceJob("Opening Liferay 7 Plugins SDK Project")
{
@Override
public IStatus runInWorkspace( IProgressMonitor monitor ) throws CoreException
{
SDKUtil.openAsProject( sdk );
return Status.OK_STATUS;
}
}.schedule();
}
}
}
public Image getImage( String key )
{
return getImageRegistry().get( key );
}
public ImageDescriptor getImageDescriptor( String key )
{
getImageRegistry();
return imageDescriptors.get( key );
}
public synchronized IDocumentProvider getTextFileDocumentProvider()
{
if( fTextFileDocumentProvider == null )
{
fTextFileDocumentProvider = new TextFileDocumentProvider();
}
return fTextFileDocumentProvider;
}
private void registerMBeans()
{
try
{
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
ObjectName name = new ObjectName("com.liferay.ide.ui:type=WorkspaceHelper");
WorkspaceHelper mbean = new WorkspaceHelper();
mbs.registerMBean(mbean, name);
}
catch( Exception e )
{
logError( "Unable to start workspaceHelper MBean", e );
}
}
private void registerResolvers()
{
final ContextTypeRegistry templateContextRegistry = JavaPlugin.getDefault().getTemplateContextRegistry();
final Iterator<?> ctIter = templateContextRegistry.contextTypes();
while( ctIter.hasNext() )
{
final Object next = ctIter.next();
if( next instanceof TemplateContextType )
{
final TemplateContextType contextType = (TemplateContextType) next;
if( contextType.getId().equals( "java" ) )
{
contextType.addResolver( new ServiceClassNameResolver() );
}
}
}
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext )
*/
public void start( BundleContext context ) throws Exception
{
super.start( context );
plugin = this;
serviceListener = new ServiceListener()
{
@Override
public void serviceChanged( ServiceEvent event )
{
String[] objectClass = (String[]) event.getServiceReference().getProperty( "objectClass" );
if( event.getType() == ServiceEvent.UNREGISTERING )
{
if( objectClass[0].equals( "org.eclipse.e4.ui.workbench.IWorkbench" ) )
{
File file = new File(
Platform.getLocation().append( ".metadata/.plugins/org.eclipse.e4.workbench" ).toOSString(),
"workbench.xmi" );
String content = FileUtil.readContents( file, true );
if( content != null && content.indexOf( "label=\"Liferay\"" ) != -1 )
{
content = content.replaceFirst( "label=\"Liferay\"", "label=\"Liferay Plugins\"" );
try(InputStream ins = new ByteArrayInputStream( content.getBytes() );)
{
FileUtil.writeFile( file, ins );
}
catch( Exception e )
{
}
}
}
}
}
};
context.addServiceListener( serviceListener );
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext )
*/
public void stop( BundleContext context ) throws Exception
{
plugin = null;
if( serviceListener != null )
{
context.removeServiceListener( serviceListener );
}
super.stop( context );
}
private void firstStartupComplete()
{
getPreferences().putBoolean( FIRST_STARTUP_COMPLETE, true );
}
private IEclipsePreferences getPreferences()
{
return new InstanceScope().getNode( PLUGIN_ID );
}
@SuppressWarnings( { "rawtypes", "unchecked" } )
private void installLiferayFormatterProfile()
{
PreferencesAccess access = PreferencesAccess.getOriginalPreferences();
ProfileVersioner profileVersioner = new ProfileVersioner();
IScopeContext instanceScope = access.getInstanceScope();
try
{
FormatterProfileStore store = new FormatterProfileStore( profileVersioner );
List profiles = store.readProfiles( instanceScope );
if( profiles == null )
{
profiles = new ArrayList();
}
// add liferay profile
final Profile eclipseProfile =
new CustomProfile(
"Liferay [plug-in]", getLiferaySettings(), profileVersioner.getCurrentVersion(), //$NON-NLS-1$
profileVersioner.getProfileKind() );
profiles.add( eclipseProfile );
store.writeProfiles( profiles, instanceScope );
// ProfileManager manager = new FormatterProfileManager(profiles, instanceScope, access, profileVersioner);
// manager.setSelected(eclipseProfile);
// manager.commitChanges(instanceScope);
instanceScope.getNode( JavaUI.ID_PLUGIN ).flush();
}
catch( Exception ex )
{
ex.printStackTrace();
}
finally
{
try
{
instanceScope.getNode( JavaCore.PLUGIN_ID ).flush();
}
catch( BackingStoreException e )
{
}
}
}
private boolean isFirstStartup()
{
IScopeContext[] scopes = new IScopeContext[] { new InstanceScope() };
return !( Platform.getPreferencesService().getBoolean( PLUGIN_ID, FIRST_STARTUP_COMPLETE, false, scopes ) );
}
@Override
protected void initializeImageRegistry( ImageRegistry reg )
{
registerImage( reg, IMG_LIFERAY_ICON_SMALL, "/icons/e16/liferay.png" ); //$NON-NLS-1$
}
protected void registerImage( ImageRegistry registry, String key, String path )
{
try
{
ImageDescriptor id = ImageDescriptor.createFromURL( getBundle().getEntry( path ) );
imageDescriptors.put( key, id );
registry.put( key, id );
}
catch( Exception e )
{
}
}
}