/*******************************************************************************
* 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.core.util;
import com.liferay.ide.core.IBundleProject;
import com.liferay.ide.core.ILiferayProject;
import com.liferay.ide.core.IWebProject;
import com.liferay.ide.core.LiferayCore;
import com.liferay.ide.core.adapter.NoopLiferayProject;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
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.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.osgi.framework.Version;
import org.w3c.dom.Node;
/**
* Core Utility methods
*
* @author Gregory Amerson
* @author Kuo Zhang
* @author Simon Jiang
* @author Terry Jia
*/
public class CoreUtil
{
public static void addNaturesToProject( IProject proj, String[] natureIds, IProgressMonitor monitor )
throws CoreException
{
IProjectDescription description = proj.getDescription();
String[] prevNatures = description.getNatureIds();
String[] newNatures = new String[prevNatures.length + natureIds.length];
System.arraycopy( prevNatures, 0, newNatures, 0, prevNatures.length );
for( int i = prevNatures.length; i < newNatures.length; i++ )
{
newNatures[i] = natureIds[i - prevNatures.length];
}
description.setNatureIds( newNatures );
proj.setDescription( description, monitor );
}
/**
* Compares v1 <-> v2, if v1 is greater than v2, then result will be > 0
* if v2 is greater than v1 the result will be < 0
*
* @param v1
* @param v2
* @return
*/
public static int compareVersions( Version v1, Version v2 )
{
if( v2 == v1 )
{ // quicktest
return 0;
}
int result = v1.getMajor() - v2.getMajor();
if( result != 0 )
{
return result;
}
result = v1.getMinor() - v2.getMinor();
if( result != 0 )
{
return result;
}
result = v1.getMicro() - v2.getMicro();
if( result != 0 )
{
return result;
}
return v1.getQualifier().compareTo( v2.getQualifier() );
}
public static boolean containsNullElement( Object[] array )
{
if( isNullOrEmpty( array ) )
{
return true;
}
for( int i = 0; i < array.length; i++ )
{
if( array[i] == null )
{
return true;
}
}
return false;
}
public static void createEmptyFile( IFile newFile ) throws CoreException
{
if( newFile.getParent() instanceof IFolder )
{
prepareFolder( (IFolder) newFile.getParent() );
}
newFile.create( new ByteArrayInputStream( new byte[0] ), true, null );
}
public static IStatus createErrorStatus( String msg )
{
return new Status( IStatus.ERROR, LiferayCore.PLUGIN_ID, msg );
}
public static final String createStringDigest( final String str )
{
try
{
final MessageDigest md = MessageDigest.getInstance( "SHA-256" ); //$NON-NLS-1$
final byte[] input = str.getBytes( "UTF-8" ); //$NON-NLS-1$
final byte[] digest = md.digest( input );
final StringBuilder buf = new StringBuilder();
for( int i = 0; i < digest.length; i++ )
{
String hex = Integer.toHexString( 0xFF & digest[ i ] );
if( hex.length() == 1 )
{
buf.append( '0' );
}
buf.append( hex );
}
return buf.toString();
}
catch( Exception e )
{
throw new RuntimeException( e );
}
}
public static void deleteResource( IResource resource ) throws CoreException
{
if( resource == null || !resource.exists() )
{
return;
}
resource.delete( true, null );
}
public static boolean empty( Object[] array )
{
return isNullOrEmpty( array );
}
public static boolean empty( String val )
{
return isNullOrEmpty( val );
}
public static IProject[] getAllProjects()
{
return ResourcesPlugin.getWorkspace().getRoot().getProjects();
}
/**
* @param project
* @return
*/
public static IClasspathEntry[] getClasspathEntries( IProject project )
{
if( project != null )
{
IJavaProject javaProject = JavaCore.create( project );
try
{
IClasspathEntry[] classPathEntries = javaProject.getRawClasspath();
return classPathEntries;
}
catch( JavaModelException e )
{
}
}
return null;
}
public static IFolder getDefaultDocrootFolder( IProject project )
{
IFolder retval = null;
final IWebProject webproject = LiferayCore.create( IWebProject.class, project );
if( webproject != null )
{
retval = webproject.getDefaultDocrootFolder();
}
return retval;
}
public static IProject getLiferayProject( IResource resource )
{
IProject project = null;
if( resource != null && resource.exists() )
{
project = resource.getProject();
}
if( project != null && project.exists() )
{
if( isLiferayProject( project ) )
{
return project;
}
else
{
final IProject[] projects = getAllProjects();
for( IProject proj : projects )
{
if( proj.getLocation() != null &&
project.getLocation().isPrefixOf( proj.getLocation() ) &&
isLiferayProject( proj ) )
{
return proj;
}
}
}
}
return null;
/*IProject retval = null;
if( resource == null || ! resource.exists() )
{
return retval;
}
if( CoreUtil.isLiferayProject( resource.getProject() ) )
{
retval = resource.getProject();
}
else
{
IContainer container = resource.getParent();
while( container != null && container.exists() && container.getParent() != null )
{
IFile projectFile = container.getFile( new Path( ".project" ) );
if( projectFile != null && projectFile.exists() )
{
for( IProject project : getAllProjects() )
{
if( container.getLocation().equals( project.getLocation() ) )
{
if( CoreUtil.isLiferayProject( project ) )
{
retval = project;
break;
}
}
}
if( retval != null )
{
break;
}
}
container = container.getParent();
}
}
return retval;*/
}
public static IProject getLiferayProject( String projectName )
{
return getLiferayProject( getProject( projectName ) );
}
public static Object getNewObject( Object[] oldObjects, Object[] newObjects )
{
if( oldObjects != null && newObjects != null && oldObjects.length < newObjects.length )
{
for( int i = 0; i < newObjects.length; i++ )
{
boolean found = false;
Object object = newObjects[i];
for( int j = 0; j < oldObjects.length; j++ )
{
if( oldObjects[j] == object )
{
found = true;
break;
}
}
if( !found )
{
return object;
}
}
}
if( oldObjects == null && newObjects != null && newObjects.length == 1 )
{
return newObjects[0];
}
return null;
}
public static IProject getProject( String projectName )
{
return getWorkspaceRoot().getProject( projectName );
}
public static IPath getResourceLocation( IResource resource )
{
IPath retval = null;
if( resource != null )
{
retval = resource.getLocation();
if( retval == null )
{
retval = resource.getRawLocation();
}
}
return retval;
}
public final static List<IFolder> getSourceFolders( final IJavaProject project )
{
final List<IFolder> folders = new ArrayList<IFolder>();
if( project != null )
{
final IClasspathEntry[] entries = project.readRawClasspath();
for( final IClasspathEntry entry : entries )
{
if( entry.getEntryKind() == IClasspathEntry.CPE_SOURCE && entry.getPath().segmentCount() > 0 )
{
IContainer container = null;
if( entry.getPath().segmentCount() == 1 )
{
container = ResourcesPlugin.getWorkspace().getRoot().getProject( entry.getPath().segment( 0 ) );
}
else
{
container = ResourcesPlugin.getWorkspace().getRoot().getFolder( entry.getPath() );
}
if( !folders.contains( container ) && container instanceof IFolder )
{
folders.add( (IFolder) container );
}
}
}
}
return folders;
}
public static IWorkspace getWorkspace()
{
return ResourcesPlugin.getWorkspace();
}
public static IWorkspaceRoot getWorkspaceRoot()
{
return ResourcesPlugin.getWorkspace().getRoot();
}
public static Object invoke( String methodName, Object object, Class<?>[] argTypes, Object[] args )
throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException,
InvocationTargetException
{
Method method = object.getClass().getDeclaredMethod( methodName, argTypes );
method.setAccessible( true );
return method.invoke( object, args );
}
public static boolean isEqual( Object object1, Object object2 )
{
return object1 != null && object2 != null && object1.equals( object2 );
}
public static boolean isLiferayProject( IProject project )
{
if( project != null )
{
ILiferayProject lrproject = LiferayCore.create( project );
return lrproject != null && !( lrproject instanceof NoopLiferayProject );
}
return false;
}
public static boolean isLinux()
{
return Platform.OS_LINUX.equals( Platform.getOS() );
}
public static boolean isMac()
{
return Platform.OS_MACOSX.equals( Platform.getOS() );
}
public static boolean isNotNullOrEmpty( Object[] array )
{
return !isNullOrEmpty( array );
}
public static boolean isNullOrEmpty( List<?> list )
{
return list == null || list.size() == 0;
}
public static boolean isNullOrEmpty( Object[] array )
{
return array == null || array.length == 0;
}
public static boolean isNullOrEmpty( String val )
{
return val == null || val.equals( StringPool.EMPTY ) || val.trim().equals( StringPool.EMPTY );
}
public static boolean isNumeric( String str )
{
try
{
Double.parseDouble( str );
}
catch( NumberFormatException nfe )
{
return false;
}
return true;
}
public static boolean isWindows()
{
return Platform.OS_WIN32.equals( Platform.getOS() );
}
public static void makeFolders( IFolder folder ) throws CoreException
{
if( folder == null )
{
return;
}
IContainer parent = folder.getParent();
if( parent instanceof IFolder )
{
makeFolders( (IFolder) parent );
}
if( !folder.exists() )
{
folder.create( true, true, null );
}
}
public static IProgressMonitor newSubMonitor( final IProgressMonitor parent, final int ticks )
{
return( parent == null ? null : new SubProgressMonitor( parent, ticks ) );
}
public static void prepareFolder( IFolder folder ) throws CoreException
{
IContainer parent = folder.getParent();
if( parent instanceof IFolder )
{
prepareFolder( (IFolder) parent );
}
if( !folder.exists() )
{
folder.create( IResource.FORCE, true, null );
}
}
public static String readPropertyFileValue( File propertiesFile, String key ) throws IOException
{
try(FileInputStream fis = new FileInputStream( propertiesFile ))
{
Properties props = new Properties();
props.load( fis );
return props.getProperty( key );
}
}
public static String readStreamToString( InputStream contents ) throws IOException
{
return readStreamToString( contents, true );
}
public static String readStreamToString( InputStream contents, boolean closeStream ) throws IOException
{
if( contents == null )
{
return null;
}
final char[] buffer = new char[0x10000];
StringBuilder out = new StringBuilder();
Reader in = new InputStreamReader( contents, "UTF-8" ); //$NON-NLS-1$
int read;
do
{
read = in.read( buffer, 0, buffer.length );
if( read > 0 )
{
out.append( buffer, 0, read );
}
}
while( read >= 0 );
if( closeStream )
{
contents.close();
}
return out.toString();
}
public static Version readVersionFile( File versionInfoFile )
{
String versionContents = FileUtil.readContents( versionInfoFile );
if( CoreUtil.isNullOrEmpty( versionContents ) )
{
return Version.emptyVersion;
}
Version version = null;;
try
{
version = Version.parseVersion( versionContents.trim() );
}
catch( NumberFormatException e )
{
version = Version.emptyVersion;
}
return version;
}
public static void removeChildren( Node node )
{
if( node != null )
{
while( node.hasChildNodes() )
{
node.removeChild( node.getFirstChild() );
}
}
}
public static void writeStreamFromString( String contents, OutputStream outputStream ) throws IOException
{
if( contents == null )
{
return;
}
final char[] buffer = new char[0x10000];
Reader in = new InputStreamReader( new ByteArrayInputStream( contents.getBytes( "UTF-8" ) ) ); //$NON-NLS-1$
Writer out = new OutputStreamWriter( outputStream, "UTF-8" ); //$NON-NLS-1$
int read;
do
{
read = in.read( buffer, 0, buffer.length );
if( read > 0 )
{
out.write( buffer, 0, read );
}
}
while( read >= 0 );
in.close();
out.flush();
out.close();
}
}