/*******************************************************************************
* 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;
import com.liferay.ide.core.util.CoreUtil;
import com.liferay.ide.core.util.PropertiesUtil;
import java.lang.ref.WeakReference;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.WeakHashMap;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.osgi.util.NLS;
/**
* @author Kuo Zhang
*/
public class LiferayLanguagePropertiesValidator
{
public final static String ID_LANGUAGE_PROPERTIES_ENCODING_NOT_DEFAULT = "language-properties-encoding-not-defalut";
public final static String LIFERAY_LANGUAGE_PROPERTIES_MARKER_TYPE = "com.liferay.ide.core.LiferayLanguagePropertiesMarker";
private static WeakHashMap<IFile, WeakReference<LiferayLanguagePropertiesValidator>> filesAndValidators =
new WeakHashMap<IFile, WeakReference<LiferayLanguagePropertiesValidator>>();
public static final String LOCATION_ENCODING= "Properties/Resource/Text file encoding";
public final static String MESSAGE_LANGUAGE_PROPERTIES_ENCODING_NOT_DEFALUT = Msgs.languagePropertiesEncodingNotDefault;
private IFile file;
private Set<IMarker> markers = new HashSet<IMarker>();
// This is for the case where the workspace is closed accidently, clear those alive but incorrect markers.
public static void clearAbandonedMarkers()
{
try
{
final IMarker[] markers =
CoreUtil.getWorkspaceRoot().findMarkers(
LIFERAY_LANGUAGE_PROPERTIES_MARKER_TYPE, true, IResource.DEPTH_INFINITE );
for( IMarker marker : markers )
{
if( ! marker.getResource().exists() )
{
marker.delete();
}
else
{
if( marker.getResource().getType() == IResource.FILE )
{
getValidator( (IFile) marker.getResource() ).validateEncoding();
}
}
}
}
catch( CoreException e )
{
}
}
public static void clearUnusedValidatorsAndMarkers( IProject project ) throws CoreException
{
synchronized( filesAndValidators )
{
Set<IFile> files = filesAndValidators.keySet();
for( Iterator<IFile> iterator = files.iterator(); iterator.hasNext(); )
{
IFile file = iterator.next();
if( ! PropertiesUtil.isLanguagePropertiesFile( file ) )
{
iterator.remove();
}
}
final IMarker[] markers =
project.getWorkspace().getRoot().findMarkers(
LIFERAY_LANGUAGE_PROPERTIES_MARKER_TYPE, true, IResource.DEPTH_INFINITE );
for( IMarker marker : markers )
{
if( ! marker.getResource().exists() )
{
marker.delete();
}
else
{
if( marker.getResource().getType() == IResource.FILE )
{
if( ! files.contains( (IFile) marker.getResource() ) )
{
marker.delete();
}
}
}
}
}
}
public static LiferayLanguagePropertiesValidator getValidator( IFile file )
{
synchronized( filesAndValidators )
{
try
{
if( filesAndValidators.get( file ).get() != null )
{
return filesAndValidators.get( file ).get();
}
else
{
throw new NullPointerException();
}
}
catch( NullPointerException e )
{
LiferayLanguagePropertiesValidator validator = new LiferayLanguagePropertiesValidator( file );
filesAndValidators.put( file, new WeakReference<LiferayLanguagePropertiesValidator>( validator ) );
return validator;
}
}
}
private LiferayLanguagePropertiesValidator( IFile file )
{
this.file = file;
try
{
for( IMarker marker : file.findMarkers(
LIFERAY_LANGUAGE_PROPERTIES_MARKER_TYPE, false, IResource.DEPTH_INFINITE ) )
{
if( ID_LANGUAGE_PROPERTIES_ENCODING_NOT_DEFAULT.equals( marker.getAttribute( IMarker.SOURCE_ID ) ) )
{
markers.add( marker );
}
}
}
catch( CoreException e )
{
LiferayCore.logError( e );
}
}
private void clearMarker( String markerSourceId )
{
try
{
synchronized( markers )
{
for( IMarker marker : markers )
{
if( marker != null && marker.exists() &&
markerSourceId.equals( marker.getAttribute( IMarker.SOURCE_ID ) ) )
{
markers.remove( marker );
marker.delete();
}
}
}
}
catch( CoreException e )
{
LiferayCore.logError( e );
}
}
private void setMarker( String markerType, String markerSourceId, int markerSeverity, String location, String markerMsg )
throws CoreException, InterruptedException
{
synchronized( markers )
{
for( IMarker marker : markers )
{
if( marker != null && marker.exists() &&
markerSourceId.equals( marker.getAttribute( IMarker.SOURCE_ID ) ) )
{
return;
}
}
IMarker marker = file.createMarker( markerType );
marker.setAttribute( IMarker.SEVERITY, markerSeverity );
marker.setAttribute( IMarker.MESSAGE, markerMsg );
marker.setAttribute( IMarker.SOURCE_ID, markerSourceId );
marker.setAttribute( IMarker.LOCATION, location );
markers.add( marker );
}
}
public void validateEncoding()
{
if( PropertiesUtil.isLanguagePropertiesFile( file ) )
{
try
{
if( ! ILiferayConstants.LANGUAGE_PROPERTIES_FILE_ENCODING_CHARSET.equals( file.getCharset() ) )
{
setMarker(
LIFERAY_LANGUAGE_PROPERTIES_MARKER_TYPE, ID_LANGUAGE_PROPERTIES_ENCODING_NOT_DEFAULT,
IMarker.SEVERITY_WARNING, LOCATION_ENCODING,
NLS.bind( MESSAGE_LANGUAGE_PROPERTIES_ENCODING_NOT_DEFALUT, new Object[] { file.getName() } ) );
}
else
{
clearMarker( ID_LANGUAGE_PROPERTIES_ENCODING_NOT_DEFAULT );
}
}
catch( Exception e )
{
LiferayCore.logError( e );
}
}
else
{
clearMarker( ID_LANGUAGE_PROPERTIES_ENCODING_NOT_DEFAULT );
}
}
private static class Msgs extends NLS
{
public static String languagePropertiesEncodingNotDefault;
static
{
initializeMessages( LiferayLanguagePropertiesValidator.class.getName(), Msgs.class );
}
}
}