Skip to content

Commit

Permalink
Fixes for ui plugin, ProgressFeatureCollection was rewritten to allow…
Browse files Browse the repository at this point in the history
… more than one iterator to progress the monitor
  • Loading branch information
jodygarnett committed Nov 2, 2012
1 parent 8c8b6c5 commit b43f6e2
Show file tree
Hide file tree
Showing 4 changed files with 225 additions and 84 deletions.
Expand Up @@ -26,6 +26,7 @@
import org.eclipse.swt.dnd.TransferData;
import org.geotools.data.DataUtilities;
import org.geotools.data.simple.SimpleFeatureCollection;
import org.geotools.feature.DefaultFeatureCollection;
import org.geotools.feature.FeatureCollection;
import org.geotools.feature.FeatureCollections;
import org.geotools.feature.simple.SimpleFeatureBuilder;
Expand Down Expand Up @@ -107,10 +108,9 @@ public boolean validate(Object object) {
* @author jeichar
*/
public static class GMLStrategy implements TransferStrategy {
@SuppressWarnings("unchecked") //$NON-NLS-1$
public void javaToNative(Object object, TransferData transferData) {
SimpleFeature feature=(SimpleFeature) object;
FeatureCollection<SimpleFeatureType, SimpleFeature> collection = FeatureCollections.newCollection();
DefaultFeatureCollection collection = new DefaultFeatureCollection();
collection.add(feature);
FeatureTransformer transformer=new FeatureTransformer();
transformer.setIndentation(4);
Expand All @@ -121,11 +121,10 @@ public void javaToNative(Object object, TransferData transferData) {
}
}

@SuppressWarnings("deprecation")
public Object nativeToJava(TransferData transferData) {
String string = (String) TextTransfer.getInstance().nativeToJava(transferData);
InputSource input = new InputSource(new StringReader(string));
SimpleFeatureCollection collection = FeatureCollections.newCollection();
DefaultFeatureCollection collection = new DefaultFeatureCollection();
GMLReceiver receiver=new GMLReceiver(collection);
GMLFilterFeature filterFeature = new GMLFilterFeature(receiver);
GMLFilterGeometry filterGeometry = new GMLFilterGeometry(filterFeature);
Expand Down
Expand Up @@ -14,6 +14,8 @@
*/
package net.refractions.udig.ui;

import java.io.Closeable;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
Expand All @@ -24,6 +26,7 @@
import org.eclipse.jface.viewers.IStructuredSelection;
import org.geotools.feature.FeatureCollection;
import org.geotools.feature.FeatureIterator;
import org.opengis.feature.Feature;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;

Expand All @@ -34,22 +37,26 @@
* @since 1.1.0
*/
public class FeatureCollectionSelection implements IStructuredSelection, IBlockingSelection {
Collection<Iterator> openIterators=new ArrayList<Iterator>();
Collection<Iterator<Feature>> openIterators=new ArrayList<Iterator<Feature>>();
FeatureCollection<SimpleFeatureType, SimpleFeature> wrapped;
private volatile SimpleFeature firstElement;
public FeatureCollectionSelection( FeatureCollection<SimpleFeatureType, SimpleFeature> selectedFeatures ) {
this.wrapped=selectedFeatures;
}
@Override
protected void finalize() throws Throwable {
for( Iterator iterator : openIterators ) {
wrapped.close(iterator);
for( Iterator<Feature> iterator : openIterators ) {
if( iterator instanceof Closeable ){
((Closeable)iterator).close();
}
}
super.finalize();
}

public Object getFirstElement() {
if( isEmpty() )
if( isEmpty() ){
throw new NoSuchElementException("SimpleFeature Collection is empty, there is no first element"); //$NON-NLS-1$
}
if( firstElement==null ){
synchronized (this) {
if( firstElement==null ){
Expand All @@ -65,10 +72,16 @@ public Object getFirstElement() {
return firstElement;
}

@SuppressWarnings("rawtypes")
public Iterator iterator() {
Iterator iter=wrapped.iterator();
openIterators.add(iter);
return iter;
if( wrapped instanceof Collection){
return ((Collection)wrapped).iterator();
}
else {
Iterator iter=new SelectionIterator( wrapped.features() );
openIterators.add(iter);
return iter;
}
}

public int size() {
Expand All @@ -80,23 +93,64 @@ public Object[] toArray() {
}

@SuppressWarnings("unchecked")
public List toList() {
if( wrapped instanceof List)
public List<SimpleFeature> toList() {
if( wrapped instanceof List){
return (List) wrapped;
LinkedList arrayList = new LinkedList();
Iterator iter=wrapped.iterator();
}
LinkedList list = new LinkedList();
FeatureIterator<SimpleFeature> iter = wrapped.features();
try{
while(iter.hasNext()){
arrayList.add(iter.next());
list.add(iter.next());
}
}finally{
wrapped.close(iter);
iter.close();
}
return arrayList;
return list;
}

public boolean isEmpty() {
return wrapped.isEmpty();
}
}

class SelectionIterator implements Iterator<Feature>,Closeable {
FeatureIterator<SimpleFeature> delegate = null;
public SelectionIterator(FeatureIterator<SimpleFeature> features) {
delegate = features;
}

@Override
public boolean hasNext() {
if( delegate == null ) return false;
boolean hasNext = delegate.hasNext();

if(!hasNext){ // autoclose!
delegate.close();
delegate = null;
}
return hasNext;
}

@Override
public Feature next() {
if( delegate == null ){
throw new NoSuchElementException();
}
return delegate.next();
}

@Override
public void remove() {
throw new UnsupportedOperationException();
}

@Override
public void close() {
if( delegate != null ){
delegate.close();
delegate = null;
}
}

}
Expand Up @@ -14,6 +14,7 @@
*/
package net.refractions.udig.ui;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
Expand All @@ -39,11 +40,18 @@
import org.eclipse.swt.widgets.Scrollable;
import org.eclipse.swt.widgets.Table;
import org.eclipse.ui.PlatformUI;
import org.geotools.data.FeatureEvent;
import org.geotools.data.FeatureListener;
import org.geotools.data.Query;
import org.geotools.data.simple.SimpleFeatureCollection;
import org.geotools.data.simple.SimpleFeatureIterator;
import org.geotools.feature.CollectionEvent;
import org.geotools.feature.CollectionListener;
import org.geotools.feature.DefaultFeatureCollection;
import org.geotools.feature.FeatureCollection;
import org.geotools.feature.FeatureCollections;
import org.geotools.feature.FeatureIterator;
import org.opengis.feature.Feature;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.feature.simple.SimpleFeatureType;

Expand All @@ -61,54 +69,131 @@ public FeatureTableContentProvider( FeatureTableControl control, IProvider<IProg
this.progressMonitorProvider=progressMonitorProvider;
}

private CollectionListener listener = new CollectionListener(){
public void collectionChanged( CollectionEvent event ) {
if (listener == null)
event.getCollection().removeListener(this);
SimpleFeature changed[] = event.getFeatures();
TableViewer viewer = FeatureTableContentProvider.this.owningFeatureTableControl
.getViewer();

switch( event.getEventType() ) {
case CollectionEvent.FEATURES_ADDED:
for( int i = 0; i < changed.length; i++ ) {
features.add(changed[i]);
private FeatureListener featureListener = new FeatureListener() {
@Override
public void changed(FeatureEvent event) {
if (featureListener == null){
event.getFeatureSource().removeFeatureListener(this);
return;
}
TableViewer viewer = owningFeatureTableControl.getViewer();

switch( event.getType() ){
case ADDED: {
try {
FeatureCollection<SimpleFeatureType,SimpleFeature> changed = (FeatureCollection<SimpleFeatureType, SimpleFeature>) event.getFeatureSource().getFeatures( event.getFilter() );
FeatureIterator<SimpleFeature> iterator = changed.features();
try {
while( iterator.hasNext() ){
SimpleFeature newFeature = iterator.next();
features.add( newFeature );
}
viewer.setItemCount( event.getFeatureSource().getCount(Query.ALL) );
viewer.getTable().clearAll();
} finally {
iterator.close();
}
}
catch (IOException accessError ){
}
}
viewer.setItemCount(features.size());
viewer.getTable().clearAll();
break;
case CollectionEvent.FEATURES_REMOVED:
for( int i = 0; i < changed.length; i++ ) {
case REMOVED: {
for( Iterator<SimpleFeature> iter = features.iterator(); iter.hasNext(); ) {
if (iter.next().getID().equals(changed[i].getID())) {
iter.remove();
break;
}

SimpleFeature feature = iter.next();
if( event.getFilter().evaluate( feature ) ){
iter.remove(); // event indicated this feature has been removed
}
}
viewer.setItemCount(features.size());
viewer.setItemCount( features.size() );
viewer.getTable().clearAll();
}
break;
case CollectionEvent.FEATURES_CHANGED:
for( int i = 0; i < changed.length; i++ ) {
int j = 0;
for( ListIterator<SimpleFeature> iter = features.listIterator(); iter.hasNext(); ) {
j++;
if (iter.next().getID().equals(changed[i].getID())) {
iter.set(changed[i]);
break;
case CHANGED:{
try {
FeatureCollection<SimpleFeatureType,SimpleFeature> changed = (FeatureCollection<SimpleFeatureType, SimpleFeature>) event.getFeatureSource().getFeatures( event.getFilter() );
FeatureIterator<SimpleFeature> iterator = changed.features();
try {
while( iterator.hasNext() ){
SimpleFeature changedFeature = iterator.next();
SCAN: for( ListIterator<SimpleFeature> iter = features.listIterator(); iter.hasNext(); ) {
SimpleFeature item = iter.next();
if (item.getID().equals( changedFeature.getID() )) {
iter.set(changedFeature);
break SCAN;
}
}
}
viewer.setItemCount( event.getFeatureSource().getCount(Query.ALL) );
viewer.getTable().clearAll();
} finally {
iterator.close();
}
}
catch (IOException accessError ){
}
}
viewer.getTable().clearAll();
break;

default:
case COMMIT:
// TBD
break;
case ROLLBACK:
// TBD
break;
}
}
};

// private CollectionListener listener = new CollectionListener(){
// public void collectionChanged( CollectionEvent event ) {
// if (listener == null){
// //event.getCollection().removeListener(this);
// }
// SimpleFeature changed[] = event.getFeatures();
// TableViewer viewer = FeatureTableContentProvider.this.owningFeatureTableControl
// .getViewer();
//
// switch( event.getEventType() ) {
// case CollectionEvent.FEATURES_ADDED:
// for( int i = 0; i < changed.length; i++ ) {
// features.add(changed[i]);
// }
// viewer.setItemCount(features.size());
// viewer.getTable().clearAll();
// break;
// case CollectionEvent.FEATURES_REMOVED:
// for( int i = 0; i < changed.length; i++ ) {
// for( Iterator<SimpleFeature> iter = features.iterator(); iter.hasNext(); ) {
// if (iter.next().getID().equals(changed[i].getID())) {
// iter.remove();
// break;
// }
//
// }
// viewer.setItemCount(features.size());
// viewer.getTable().clearAll();
// }
// break;
// case CollectionEvent.FEATURES_CHANGED:
// for( int i = 0; i < changed.length; i++ ) {
// int j = 0;
// for( ListIterator<SimpleFeature> iter = features.listIterator(); iter.hasNext(); ) {
// j++;
// if (iter.next().getID().equals(changed[i].getID())) {
// iter.set(changed[i]);
// break;
// }
// }
// }
// viewer.getTable().clearAll();
// break;
//
// default:
// break;
// }
// }
// };

// Memory bound cache of features for table
// May be sorted according to FID or any of the attributes so don't rely on any given order because
Expand Down Expand Up @@ -158,11 +243,11 @@ public boolean isTrue() {

if (oldInput != null) {
FeatureCollection<SimpleFeatureType, SimpleFeature> old = ((FeatureCollection<SimpleFeatureType, SimpleFeature>) oldInput);
old.removeListener(listener);
// old.removeListener(listener);
}
if (newInput != null) {
FeatureCollection<SimpleFeatureType, SimpleFeature> input = ((FeatureCollection<SimpleFeatureType, SimpleFeature>) newInput);
input.addListener(listener);
// input.addListener(listener);
}

if (newInput == null)
Expand Down Expand Up @@ -280,8 +365,9 @@ public void run() throws Exception {
UiPlugin.log("error loading features in table view", t); //$NON-NLS-1$
return;
} finally {
if (iterator != null)
input.close(iterator);
if (iterator != null){
iterator.close();
}
UiPlugin.trace(Trace.FEATURE_TABLE, FeatureTableContentProvider.class,
"Ending ContentLoader, Cancel state is:"+monitor.isCanceled(), null); //$NON-NLS-1$
}
Expand Down Expand Up @@ -575,7 +661,7 @@ public void assertInternallyConsistent(){
* @return returns a collection of the deleted features
*/
public FeatureCollection<SimpleFeatureType, SimpleFeature> deleteSelection() {
final FeatureCollection<SimpleFeatureType, SimpleFeature> deletedFeatures = FeatureCollections.newCollection();
final DefaultFeatureCollection deletedFeatures = new DefaultFeatureCollection();
Runnable updateTable = new Runnable(){
@SuppressWarnings("unchecked")
public void run() {
Expand Down

0 comments on commit b43f6e2

Please sign in to comment.