/*******************************************************************************
* 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.gradle.ui.action;
import com.liferay.ide.core.util.CoreUtil;
import com.liferay.ide.gradle.core.modules.OverrideFilePath;
import java.io.File;
import java.io.IOException;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.sapphire.ElementList;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
/**
* @author Terry Jia
*/
public class OSGiBundleFileSelectionDialog extends ElementTreeSelectionDialog
{
private static ElementList<OverrideFilePath> files;
protected static String projectName = "";
protected static class FileContentProvider implements ITreeContentProvider
{
private final Object[] EMPTY = new Object[0];
public void dispose()
{
}
public Object[] getChildren( Object parentElement )
{
return EMPTY;
}
public Object[] getElements( Object element )
{
Set<String> possibleValues = new HashSet<String>();
if( element instanceof File )
{
File file = (File) element;
if( file.exists() )
{
try( JarFile jar = new JarFile( file ) )
{
Enumeration<JarEntry> enu = jar.entries();
while( enu.hasMoreElements() )
{
JarEntry entry = enu.nextElement();
String name = entry.getName();
if( ( name.startsWith( "META-INF/resources/" ) &&
( name.endsWith( ".jsp" ) || name.endsWith( ".jspf" ) ) ) ||
name.equals( "portlet.properties" ) )
{
possibleValues.add( name );
}
}
}
catch( IOException e )
{
}
}
}
for( OverrideFilePath file : files )
{
String currentFile = file.getValue().content();
possibleValues.remove( currentFile );
}
if( projectName != null )
{
IProject project = CoreUtil.getProject( projectName );
IFolder javaFolder = project.getFolder( "src/main/java" );
IFolder resourceFolder = project.getFolder( "src/main/resources" );
Iterator<String> it = possibleValues.iterator();
while( it.hasNext() )
{
String v = it.next();
if( resourceFolder.getFile( v ).exists() )
{
it.remove();
}
if( javaFolder.getFile( "portlet-ext.properties" ).exists() && v.equals( "portlet.properties" ) )
{
it.remove();
}
}
}
return possibleValues.toArray();
}
public Object getParent( Object element )
{
return null;
}
public boolean hasChildren( Object element )
{
return false;
}
public void inputChanged( Viewer viewer, Object oldInput, Object newInput )
{
}
}
protected static class FileLabelProvider extends LabelProvider
{
private final Image IMG_FILE =
PlatformUI.getWorkbench().getSharedImages().getImage( ISharedImages.IMG_OBJ_FILE );
public Image getImage( Object element )
{
return IMG_FILE;
}
public String getText( Object element )
{
return element.toString();
}
}
public OSGiBundleFileSelectionDialog( Shell parent, ElementList<OverrideFilePath> currentFiles, String projectName )
{
super( parent, new FileLabelProvider(), new FileContentProvider() );
files = currentFiles;
this.projectName = projectName;
setComparator( new ViewerComparator() );
}
}