/*
* Copyright (c) 2012 Data Harmonisation Panel
*
* All rights reserved. This program and the accompanying materials are made
* available under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution. If not, see <http://www.gnu.org/licenses/>.
*
* Contributors:
* HUMBOLDT EU Integrated Project #030962
* Data Harmonisation Panel <http://www.dhpanel.eu>
*/
package eu.esdihumboldt.hale.io.wfs.ui;
import java.io.InputStream;
import java.net.URI;
import java.util.Collection;
import java.util.HashSet;
import javax.annotation.Nullable;
import org.apache.http.NameValuePair;
import org.apache.http.client.utils.URIBuilder;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.jface.preference.FieldEditor;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import com.google.common.base.Predicate;
import eu.esdihumboldt.hale.common.core.io.IOProvider;
import eu.esdihumboldt.hale.common.core.io.ImportProvider;
import eu.esdihumboldt.hale.common.core.io.extension.IOProviderDescriptor;
import eu.esdihumboldt.hale.common.core.io.supplier.DefaultInputSupplier;
import eu.esdihumboldt.hale.common.core.io.supplier.LocatableInputSupplier;
import eu.esdihumboldt.hale.ui.io.ImportSource;
import eu.esdihumboldt.hale.ui.io.source.AbstractProviderSource;
import eu.esdihumboldt.hale.ui.io.source.AbstractSource;
import eu.esdihumboldt.hale.ui.io.source.URLSourceURIFieldEditor;
import eu.esdihumboldt.hale.ui.util.io.URIFieldEditor;
/**
* Abstract base implementation for import sources based on WFS
*
* @param <P> the supported {@link IOProvider} type
*
* @author Simon Templer
*/
public abstract class AbstractWFSSource<P extends ImportProvider> extends AbstractProviderSource<P> {
private URLSourceURIFieldEditor sourceURL;
/**
* @see ImportSource#createControls(Composite)
*/
@Override
public void createControls(Composite parent) {
parent.setLayout(new GridLayout(4, false));
// caption
new Label(parent, SWT.NONE); // placeholder
Label caption = new Label(parent, SWT.NONE);
caption.setText(getCaption());
caption.setLayoutData(new GridData(SWT.BEGINNING, SWT.BEGINNING, true, false, 3, 1));
// source file
// target URL field
sourceURL = new URLSourceURIFieldEditor("sourceURL", "URL:", parent) {
// the following methods are overridden so the capabilities button
// may appear on the same line
@Override
public int getNumberOfControls() {
return super.getNumberOfControls() + 1;
}
@Override
protected void doFillIntoGrid(Composite parent, int numColumns) {
super.doFillIntoGrid(parent, numColumns - 1);
}
};
sourceURL.setPage(getPage());
// set custom URI filter
sourceURL.setURIFilter(createHistoryURIFilter());
// set content types for URI field
Collection<IOProviderDescriptor> factories = getConfiguration().getFactories();
HashSet<IContentType> supportedTypes = new HashSet<IContentType>();
for (IOProviderDescriptor factory : factories) {
supportedTypes.addAll(factory.getSupportedTypes());
}
sourceURL.setContentTypes(supportedTypes);
sourceURL.setPropertyChangeListener(new IPropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent event) {
if (event.getProperty().equals(FieldEditor.IS_VALID)) {
getPage().setMessage(null);
updateState(true);
}
else if (event.getProperty().equals(FieldEditor.VALUE)) {
getPage().setMessage(null);
updateState(true);
}
}
});
// button to determine from capabilities
Button capButton = new Button(parent, SWT.PUSH);
capButton.setText("...");
capButton.setToolTipText("Determine based on WFS Capabilities");
capButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
determineSource(sourceURL);
}
});
// provider selection
// label
Label providerLabel = new Label(parent, SWT.NONE);
providerLabel.setText("Import as");
// create provider combo
ComboViewer providers = createProviders(parent);
providers.getControl().setLayoutData(
new GridData(SWT.FILL, SWT.BEGINNING, true, false, 3, 1));
// initial state update
updateState(true);
}
/**
* @return a custom filter for the URI history
*/
@Nullable
protected Predicate<? super URI> createHistoryURIFilter() {
return new Predicate<URI>() {
@Override
public boolean apply(URI input) {
String expectedRequest = getWFSRequestValue();
URIBuilder uri = new URIBuilder(input);
for (NameValuePair param : uri.getQueryParams()) {
if ("request".equalsIgnoreCase(param.getName())
&& expectedRequest.equals(param.getValue())) {
return true;
}
}
return false;
}
};
}
/**
* @return the value to use for the REQUEST parameter for a WFS request with
* this source
*/
protected abstract String getWFSRequestValue();
/**
* Let the user determine the source URL to use, e.g. though a dialog or
* wizard.
*
* @param sourceURL the source URL field to edit
*/
protected abstract void determineSource(URIFieldEditor sourceURL);
/**
* Get the caption for the source page
*
* @return the caption
*/
protected abstract String getCaption();
/**
* @see AbstractProviderSource#getSource()
*/
@Override
protected LocatableInputSupplier<? extends InputStream> getSource() {
try {
URI uri = sourceURL.getURI();
return new DefaultInputSupplier(uri);
} catch (Throwable e) {
return null;
}
}
/**
* @see AbstractProviderSource#isValidSource()
*/
@Override
protected boolean isValidSource() {
return sourceURL.isValid() && sourceURL.getURI() != null;
}
/**
* @see AbstractSource#onActivate()
*/
@Override
public void onActivate() {
sourceURL.setFocus();
}
}