//$HeadURL$
/*----------------------------------------------------------------------------
This file is part of deegree, http://deegree.org/
Copyright (C) 2001-2009 by:
- Department of Geography, University of Bonn -
and
- lat/lon GmbH -
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.
You should have received a copy of the GNU Lesser General Public License
along with this library; if not, write to the Free Software Foundation, Inc.,
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Contact information:
lat/lon GmbH
Aennchenstr. 19, 53177 Bonn
Germany
http://lat-lon.de/
Department of Geography, University of Bonn
Prof. Dr. Klaus Greve
Postfach 1147, 53001 Bonn
Germany
http://www.geographie.uni-bonn.de/deegree/
e-mail: info@deegree.org
----------------------------------------------------------------------------*/
package org.deegree.igeo.commands.model;
import static java.util.Collections.singletonList;
import java.awt.Color;
import java.net.URI;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
import org.deegree.datatypes.QualifiedName;
import org.deegree.datatypes.Types;
import org.deegree.graphics.sld.PolygonSymbolizer;
import org.deegree.graphics.sld.StyleFactory;
import org.deegree.graphics.sld.UserStyle;
import org.deegree.igeo.ApplicationContainer;
import org.deegree.igeo.config.DirectStyleType;
import org.deegree.igeo.config.EnvelopeType;
import org.deegree.igeo.config.MemoryDatasourceType;
import org.deegree.igeo.config.LayerType.MetadataURL;
import org.deegree.igeo.mapmodel.Datasource;
import org.deegree.igeo.mapmodel.DirectStyle;
import org.deegree.igeo.mapmodel.Layer;
import org.deegree.igeo.mapmodel.MapModel;
import org.deegree.igeo.mapmodel.MemoryDatasource;
import org.deegree.igeo.mapmodel.NamedStyle;
import org.deegree.kernel.AbstractCommand;
import org.deegree.kernel.Command;
import org.deegree.model.Identifier;
import org.deegree.model.feature.FeatureCollection;
import org.deegree.model.feature.FeatureFactory;
import org.deegree.model.feature.FeatureProperty;
import org.deegree.model.feature.schema.FeatureType;
import org.deegree.model.feature.schema.PropertyType;
import org.deegree.model.spatialschema.Envelope;
import org.deegree.model.spatialschema.Geometry;
/**
* {@link Command} implementation for adding a layer just stored in the memory of current running iGeoDesktop instance
*
* @author <a href="mailto:name@deegree.org">Andreas Poth</a>
* @author last edited by: $Author$
*
* @version $Revision$, $Date$
*/
public class AddMemoryLayerCommand extends AbstractCommand {
public static final QualifiedName commandName = new QualifiedName( "add memory based layer command" );
private ApplicationContainer<?> appContainer;
private String title;
private Layer layerBefore;
private FeatureCollection fc;
private Layer newLayer;
private UserStyle style;
public AddMemoryLayerCommand() {
PolygonSymbolizer sym = StyleFactory.createPolygonSymbolizer( Color.WHITE, Color.RED, 2 );
sym.getFill().setOpacity( 0.3 );
style = (UserStyle) StyleFactory.createStyle( "default", sym );
}
/**
*
* @param appContainer
*/
public void setApplicationContainer( ApplicationContainer<?> appContainer ) {
this.appContainer = appContainer;
}
/**
*
* @param title
* layer title
*/
public void setTitle( String title ) {
this.title = title;
}
/**
*
* @param layerBefore
*/
public void setLayerBefore( Layer layerBefore ) {
this.layerBefore = layerBefore;
}
public void setStyle( UserStyle style ) {
}
/**
*
* @param geometries
* geometries to add as new layer
*/
public void setGeometries( List<Geometry> geometries )
throws Exception {
PropertyType[] pt = new PropertyType[2];
pt[0] = FeatureFactory.createSimplePropertyType(
new QualifiedName( "id",
URI.create( "http://www.deegree.org/app" ) ),
Types.INTEGER, false );
pt[1] = FeatureFactory.createSimplePropertyType(
new QualifiedName( "geometry",
URI.create( "http://www.deegree.org/app" ) ),
Types.GEOMETRY, false );
FeatureType ft = FeatureFactory.createFeatureType( UUID.randomUUID().toString(), false, pt );
fc = FeatureFactory.createFeatureCollection( UUID.randomUUID().toString(), geometries.size() );
int c = 0;
for ( Geometry geometry : geometries ) {
FeatureProperty[] fp = new FeatureProperty[2];
fp[0] = FeatureFactory.createFeatureProperty( pt[0].getName(), c++ );
fp[1] = FeatureFactory.createFeatureProperty( pt[1].getName(), geometry );
fc.add( FeatureFactory.createFeature( UUID.randomUUID().toString(), ft, fp ) );
}
}
/**
*
* @param fc
* feature collection to add as new layer
*/
public void setFeatureCollection( FeatureCollection fc ) {
this.fc = fc;
}
/*
* (non-Javadoc)
*
* @see org.deegree.kernel.Command#execute()
*/
public void execute()
throws Exception {
MapModel mm = appContainer.getMapModel( null );
Envelope env = mm.getEnvelope();
MemoryDatasourceType mdst = new MemoryDatasourceType();
EnvelopeType et = new EnvelopeType();
et.setMinx( env.getMin().getX() );
et.setMiny( env.getMin().getY() );
et.setMaxx( env.getMax().getX() );
et.setMaxy( env.getMax().getY() );
et.setCrs( mm.getEnvelope().getCoordinateSystem().getPrefixedName() );
mdst.setExtent( et );
mdst.setMinScaleDenominator( 0d );
mdst.setMaxScaleDenominator( 100000000d );
Datasource ds = new MemoryDatasource( mdst, null, null, fc );
Identifier id = new Identifier( title );
int i = 0;
while ( mm.exists( id ) ) {
id = new Identifier( title + "_" + i++ );
}
newLayer = new Layer( mm, id, id.getValue(), title, singletonList( ds ), Collections.<MetadataURL> emptyList() );
newLayer.setEditable( false );
List<NamedStyle> styles = new ArrayList<NamedStyle>();
DirectStyleType dst = new DirectStyleType();
dst.setCurrent( true );
dst.setName( style.getName() );
dst.setTitle( style.getTitle() );
dst.setAbstract( style.getAbstract() );
dst.setCurrent( true );
// styles.add( new NamedStyle( dst, newLayer ) );
styles.add( new DirectStyle( dst, style, newLayer ) );
newLayer.setStyles( styles );
newLayer.setVisible( true );
if ( layerBefore == null ) {
mm.insert( newLayer, mm.getLayerGroups().get( 0 ), null, true );
} else {
mm.insert( newLayer, layerBefore.getParent(), layerBefore, true );
}
}
/*
* (non-Javadoc)
*
* @see org.deegree.kernel.Command#getName()
*/
public QualifiedName getName() {
return commandName;
}
/*
* (non-Javadoc)
*
* @see org.deegree.kernel.Command#getResult()
*/
public Object getResult() {
return newLayer;
}
}