+package org.argeo.gis.ui.commands;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+import org.argeo.ArgeoException;
+import org.argeo.eclipse.ui.AbstractTreeContentProvider;
+import org.argeo.eclipse.ui.TreeParent;
+import org.argeo.geotools.jcr.GeoJcrMapper;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.geotools.data.FeatureSource;
+import org.opengis.feature.simple.SimpleFeature;
+import org.opengis.feature.simple.SimpleFeatureType;
+
+public class AddFeatureSources extends AbstractHandler {
+ private GeoJcrMapper geoJcrMapper;
+
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ try {
+ FeatureSourceChooserDialog dialog = new FeatureSourceChooserDialog(
+ HandlerUtil.getActiveShell(event));
+ if (dialog.open() == Dialog.OK) {
+ Map<String, List<FeatureSource<SimpleFeatureType, SimpleFeature>>> featureSources = dialog
+ .getFeatureSources();
+ for (String alias : featureSources.keySet()) {
+ for (FeatureSource<SimpleFeatureType, SimpleFeature> fs : featureSources
+ .get(alias)) {
+ Node fsNode = geoJcrMapper.getNode(alias, fs);
+ try {
+ fsNode.getSession().save();
+ } catch (RepositoryException e) {
+ throw new ArgeoException("Cannot save " + fsNode, e);
+ }
+ }
+ }
+ }
+ return null;
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ public void setGeoJcrMapper(GeoJcrMapper geoJcrMapper) {
+ this.geoJcrMapper = geoJcrMapper;
+ }
+
+ class FeatureSourceChooserDialog extends TitleAreaDialog {
+ private TreeViewer viewer;
+ private Map<String, List<FeatureSource<SimpleFeatureType, SimpleFeature>>> featureSources = new HashMap<String, List<FeatureSource<SimpleFeatureType, SimpleFeature>>>();
+
+ public FeatureSourceChooserDialog(Shell parentShell) {
+ super(parentShell);
+ }
+
+ protected Point getInitialSize() {
+ return new Point(300, 400);
+ }
+
+ protected Control createDialogArea(Composite parent) {
+ setTitle("Feature Source");
+ setMessage("Select or or many feature sources to register");
+ Composite dialogarea = (Composite) super.createDialogArea(parent);
+ Composite composite = new Composite(dialogarea, SWT.NONE);
+ composite.setLayout(new GridLayout(1, false));
+ composite
+ .setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+ viewer = new TreeViewer(composite);
+ viewer.getTree().setLayoutData(
+ new GridData(SWT.FILL, SWT.FILL, true, true));
+ viewer.setContentProvider(new DataStoreContentProvider());
+ viewer.setLabelProvider(new DataStoreLabelProvider());
+ viewer.setInput(geoJcrMapper.getPossibleFeatureSources());
+ parent.pack();
+ return composite;
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ protected void okPressed() {
+ Iterator<Object> it = ((IStructuredSelection) viewer.getSelection())
+ .iterator();
+ while (it.hasNext()) {
+ Object obj = it.next();
+ if (obj instanceof FeatureSourceNode) {
+ FeatureSourceNode fsn = (FeatureSourceNode) obj;
+ String alias = fsn.getDataStoreAlias();
+ if (!featureSources.containsKey(alias))
+ featureSources
+ .put(alias,
+ new ArrayList<FeatureSource<SimpleFeatureType, SimpleFeature>>());
+ featureSources.get(alias).add(fsn.getFeatureSource());
+ } else {
+ // data store node
+ String alias = obj.toString();
+ featureSources.put(alias, geoJcrMapper
+ .getPossibleFeatureSources().get(alias));
+ }
+ }
+ super.okPressed();
+ }
+
+ public Map<String, List<FeatureSource<SimpleFeatureType, SimpleFeature>>> getFeatureSources() {
+ return featureSources;
+ }
+ }
+
+ private class DataStoreContentProvider extends AbstractTreeContentProvider {
+
+ @SuppressWarnings("unchecked")
+ public Object[] getElements(Object inputElement) {
+ List<TreeParent> dataStoreNodes = new ArrayList<TreeParent>();
+ Map<String, List<FeatureSource<SimpleFeatureType, SimpleFeature>>> featureSources = (Map<String, List<FeatureSource<SimpleFeatureType, SimpleFeature>>>) inputElement;
+ for (String alias : featureSources.keySet()) {
+ TreeParent dataStoreNode = new TreeParent(alias);
+ for (FeatureSource<SimpleFeatureType, SimpleFeature> featureSource : featureSources
+ .get(alias)) {
+ dataStoreNode.addChild(new FeatureSourceNode(alias,
+ featureSource));
+ }
+ dataStoreNodes.add(dataStoreNode);
+ }
+ return dataStoreNodes.toArray();
+ }
+
+ }
+
+ private class DataStoreLabelProvider extends LabelProvider {
+
+ @Override
+ public String getText(Object element) {
+ return super.getText(element);
+ }
+
+ }
+
+ private class FeatureSourceNode extends TreeParent {
+ private final String dataStoreAlias;
+ private final FeatureSource<SimpleFeatureType, SimpleFeature> featureSource;
+
+ public FeatureSourceNode(String dataStoreAlias,
+ FeatureSource<SimpleFeatureType, SimpleFeature> featureSource) {
+ super(featureSource.getName().toString());
+ this.dataStoreAlias = dataStoreAlias;
+ this.featureSource = featureSource;
+ }
+
+ public String getDataStoreAlias() {
+ return dataStoreAlias;
+ }
+
+ public FeatureSource<SimpleFeatureType, SimpleFeature> getFeatureSource() {
+ return featureSource;
+ }
+
+ }
+
+}