001    //$HeadURL: 
002    /*----------------------------------------------------------------------------
003     This file is part of deegree, http://deegree.org/
004     Copyright (C) 2001-2010 by:
005     - Department of Geography, University of Bonn -
006     and
007     - lat/lon GmbH -
008    
009     This library is free software; you can redistribute it and/or modify it under
010     the terms of the GNU Lesser General Public License as published by the Free
011     Software Foundation; either version 2.1 of the License, or (at your option)
012     any later version.
013     This library is distributed in the hope that it will be useful, but WITHOUT
014     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
015     FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
016     details.
017     You should have received a copy of the GNU Lesser General Public License
018     along with this library; if not, write to the Free Software Foundation, Inc.,
019     59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
020    
021     Contact information:
022    
023     lat/lon GmbH
024     Aennchenstr. 19, 53177 Bonn
025     Germany
026     http://lat-lon.de/
027    
028     Department of Geography, University of Bonn
029     Prof. Dr. Klaus Greve
030     Postfach 1147, 53001 Bonn
031     Germany
032     http://www.geographie.uni-bonn.de/deegree/
033    
034     e-mail: info@deegree.org
035     ----------------------------------------------------------------------------*/
036    package org.deegree.portal.cataloguemanager.control;
037    
038    import java.io.ByteArrayOutputStream;
039    import java.io.IOException;
040    import java.net.URL;
041    import java.nio.charset.Charset;
042    import java.util.List;
043    
044    import javax.xml.bind.JAXBContext;
045    import javax.xml.bind.JAXBException;
046    import javax.xml.bind.Marshaller;
047    import javax.xml.bind.Unmarshaller;
048    
049    import org.apache.commons.httpclient.HttpClient;
050    import org.apache.commons.httpclient.HttpException;
051    import org.apache.commons.httpclient.methods.PostMethod;
052    import org.apache.commons.httpclient.methods.StringRequestEntity;
053    import org.deegree.enterprise.control.ajax.ResponseHandler;
054    import org.deegree.enterprise.control.ajax.WebEvent;
055    import org.deegree.framework.log.ILogger;
056    import org.deegree.framework.log.LoggerFactory;
057    import org.deegree.framework.util.BootLogger;
058    import org.deegree.framework.util.FileUtils;
059    import org.deegree.framework.util.StringTools;
060    import org.deegree.framework.util.TimeTools;
061    import org.deegree.model.crs.CRSFactory;
062    import org.deegree.model.crs.CRSTransformationException;
063    import org.deegree.model.crs.CoordinateSystem;
064    import org.deegree.model.spatialschema.Envelope;
065    import org.deegree.model.spatialschema.GeometryFactory;
066    import org.deegree.portal.cataloguemanager.model.Address;
067    import org.deegree.portal.cataloguemanager.model.CICitation;
068    import org.deegree.portal.cataloguemanager.model.CIDate;
069    import org.deegree.portal.cataloguemanager.model.CIDateTypeCode;
070    import org.deegree.portal.cataloguemanager.model.CIOnlineResource;
071    import org.deegree.portal.cataloguemanager.model.CIResponsibleParty;
072    import org.deegree.portal.cataloguemanager.model.Contact;
073    import org.deegree.portal.cataloguemanager.model.ContactInfo;
074    import org.deegree.portal.cataloguemanager.model.Date;
075    import org.deegree.portal.cataloguemanager.model.DateType;
076    import org.deegree.portal.cataloguemanager.model.DistributionFormat;
077    import org.deegree.portal.cataloguemanager.model.EXExtent;
078    import org.deegree.portal.cataloguemanager.model.EXGeographicBoundingBox;
079    import org.deegree.portal.cataloguemanager.model.EXTemporalExtent;
080    import org.deegree.portal.cataloguemanager.model.ExceptionBean;
081    import org.deegree.portal.cataloguemanager.model.Keyword;
082    import org.deegree.portal.cataloguemanager.model.Linkage;
083    import org.deegree.portal.cataloguemanager.model.MDDataIdentification;
084    import org.deegree.portal.cataloguemanager.model.MDDigitalTransferOptions;
085    import org.deegree.portal.cataloguemanager.model.MDDistribution;
086    import org.deegree.portal.cataloguemanager.model.MDFormat;
087    import org.deegree.portal.cataloguemanager.model.MDMetadata;
088    import org.deegree.portal.cataloguemanager.model.MDReferenceSystem;
089    import org.deegree.portal.cataloguemanager.model.MDRepresentativeFraction;
090    import org.deegree.portal.cataloguemanager.model.MetadataBean;
091    import org.deegree.portal.cataloguemanager.model.Name;
092    import org.deegree.portal.cataloguemanager.model.OnLine;
093    import org.deegree.portal.cataloguemanager.model.Phone;
094    import org.deegree.portal.cataloguemanager.model.PointOfContact;
095    import org.deegree.portal.cataloguemanager.model.SpatialResolution;
096    import org.deegree.portal.cataloguemanager.model.TimePeriod;
097    import org.deegree.portal.cataloguemanager.model.TransferOptions;
098    import org.deegree.portal.cataloguemanager.model.Version;
099    
100    /**
101     * 
102     * 
103     * 
104     * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
105     * @author last edited by: $Author: apoth $
106     * 
107     * @version $Revision: 26885 $, $Date: 2010-09-21 14:41:43 +0200 (Di, 21. Sep 2010) $
108     */
109    public class InsertMetadataListener extends AbstractMetadataListener {
110    
111        protected static CoordinateSystem crs;
112    
113        static {
114            if ( crs == null ) {
115                try {
116                    crs = CRSFactory.create( "EPSG:4326" );
117                } catch ( Exception e ) {
118                    BootLogger.logError( e.getMessage(), e );
119                }
120            }
121        }
122    
123        private static ILogger LOG = LoggerFactory.getLogger( InsertMetadataListener.class );
124    
125        protected CatalogueManagerConfiguration conf;
126    
127        @Override
128        public void actionPerformed( WebEvent event, ResponseHandler responseHandler )
129                                throws IOException {
130    
131            try {
132                conf = getCatalogueManagerConfiguration( event );
133                MetadataBean bean = (MetadataBean) event.getAsBean();
134                JAXBContext jc = JAXBContext.newInstance( "org.deegree.portal.cataloguemanager.model" );
135                Unmarshaller u = jc.createUnmarshaller();
136    
137                String tmp = conf.getTemplateURL( bean.getHlevel() );
138                URL url = conf.resolve( tmp );
139                MDMetadata mdMetadata = (MDMetadata) u.unmarshal( url );
140    
141                // metadata settings
142                mdMetadata.getFileIdentifier().setCharacterString( bean.getIdentifier() );
143                mdMetadata.getHierarchyLevel().getMDScopeCode().setCodeListValue( bean.getHlevel() );
144                tmp = bean.getHlevel();
145                if ( "series".equalsIgnoreCase( tmp ) ) {
146                    tmp = "datasetcollection";
147                }
148                mdMetadata.getHierarchyLevelName().setCharacterString( tmp );
149                setContact( mdMetadata, bean );
150                mdMetadata.getDateStamp().setDateTime( TimeTools.getISOFormattedTime() );
151                if ( bean.getCrs() != null ) {
152                    MDReferenceSystem mdRef = mdMetadata.getReferenceSystemInfo().getMDReferenceSystem();
153                    mdRef.getReferenceSystemIdentifier().getRSIdentifier().getCode().setCharacterString( bean.getCrs() );
154                }
155    
156                // data identification settings
157                MDDataIdentification mdDataId = mdMetadata.getIdentificationInfo().getMDDataIdentification();
158                mdDataId.getAbstract().setCharacterString( bean.getAbstract_() );
159                mdDataId.setUuid( "_" + bean.getIdentifier() );
160                mdDataId.setId( bean.getIdentifier() );
161                setKeywords( mdDataId, bean );
162                setPointOfContact( mdDataId, bean );
163                mdDataId.getTopicCategory().setMDTopicCategoryCode( bean.getTopCat() );
164                setExtent( mdDataId, bean );
165    
166                SpatialResolution spr = mdDataId.getSpatialResolution();
167                if ( bean.getScale() == null || bean.getScale().trim().length() == 0 ) {
168                    mdDataId.setSpatialResolution( null );
169                } else {
170                    MDRepresentativeFraction frac = spr.getMDResolution().getEquivalentScale().getMDRepresentativeFraction();
171                    frac.getDenominator().setInteger( Integer.parseInt( bean.getScale().trim() ) );
172                }
173    
174                CICitation citation = mdDataId.getCitation().getCICitation();
175                citation.getTitle().setCharacterString( bean.getDatasetTitle() );
176                citation.getIdentifier().getMDIdentifier().getCode().setCharacterString( bean.getIdentifier() );
177    
178                List<Date> dates = citation.getDate();
179                dates.clear();
180                if ( bean.getCreation() != null ) {
181                    addDate( dates, "creation", bean.getCreation() );
182                }
183                if ( bean.getPublication() != null ) {
184                    addDate( dates, "publication", bean.getPublication() );
185                }
186                if ( bean.getRevision() != null ) {
187                    addDate( dates, "revision", bean.getRevision() );
188                }
189    
190                if ( bean.getTransferOnline() != null && bean.getTransferOnline().trim().length() > 0 ) {
191                    setDistributionInfo( mdMetadata, bean );
192                } else {
193                    mdMetadata.setDistributionInfo( null );
194                }
195    
196                if ( bean.getLineage() != null && bean.getLineage().trim().length() > 0 ) {
197                    mdMetadata.getDataQualityInfo().getDQDataQuality().getLineage().getLILineage().getStatement().setCharacterString(
198                                                                                                                                      bean.getLineage() );
199                } else {
200                    mdMetadata.setDataQualityInfo( null );
201                }
202    
203                insertIntoCSW( responseHandler, mdMetadata );
204    
205            } catch ( Exception e ) {
206                LOG.logError( e.getMessage(), e );
207                ExceptionBean eb = new ExceptionBean( getClass().getName(), e.getMessage() );
208                responseHandler.writeAndClose( true, eb );
209                return;
210            }
211        }
212    
213        private void setDistributionInfo( MDMetadata mdMetadata, MetadataBean bean ) {
214            MDDistribution mddist = mdMetadata.getDistributionInfo().getMDDistribution();
215            if ( mddist == null ) {
216                mddist = new MDDistribution();
217                TransferOptions to = new TransferOptions();
218                MDDigitalTransferOptions dto = new MDDigitalTransferOptions();
219                OnLine ol = new OnLine();
220                CIOnlineResource ciolr = new CIOnlineResource();
221                ciolr.setLinkage( new Linkage() );
222                ol.setCIOnlineResource( ciolr );
223                dto.setOnLine( ol );
224                to.setMDDigitalTransferOptions( dto );
225                mddist.setTransferOptions( to );
226            }
227            MDDigitalTransferOptions to = mddist.getTransferOptions().getMDDigitalTransferOptions();
228            to.getOnLine().getCIOnlineResource().getLinkage().setURL( bean.getTransferOnline() );
229            if ( bean.getTransferFormatName() != null && bean.getTransferFormatName().length() > 0 ) {
230                DistributionFormat format = mdMetadata.getDistributionInfo().getMDDistribution().getDistributionFormat();
231                if ( format == null ) {
232                    format = new DistributionFormat();
233                    MDFormat mdf = new MDFormat();
234                    mdf.setName( new Name() );
235                    mdf.setVersion( new Version() );
236                    format.setMDFormat( mdf );
237                }
238                format.getMDFormat().getName().setCharacterString( bean.getTransferFormatName() );
239                if ( bean.getTransferFormatVersion() != null && bean.getTransferFormatVersion().length() > 0 ) {
240                    format.getMDFormat().getVersion().setCharacterString( bean.getTransferFormatVersion() );
241                } else {
242                    format.getMDFormat().getVersion().setCharacterString( "unknown" );
243                }
244            } else {
245                mdMetadata.getDistributionInfo().getMDDistribution().setDistributionFormat( null );
246            }
247        }
248    
249        private String insertIntoCSW( ResponseHandler responseHandler, MDMetadata mdMetadata )
250                                throws JAXBException, IOException, HttpException {
251    
252            JAXBContext jc = JAXBContext.newInstance( "org.deegree.portal.cataloguemanager.model" );
253            Marshaller m = jc.createMarshaller();
254    
255            ByteArrayOutputStream bos = new ByteArrayOutputStream( 10000 );
256            m.marshal( mdMetadata, bos );
257    
258            URL url = getClass().getResource( "insert.xml" );
259            String s = FileUtils.readTextFile( url ).toString();
260            String t = new String( bos.toByteArray() );
261            int c = t.indexOf( "?>" );
262            t = t.substring( c + 2 );
263            s = StringTools.replace( s, "$data$", t, false );
264            String csw = conf.getCatalogueURL();
265            PostMethod post = new PostMethod( csw );
266            post.getParams().setContentCharset( Charset.defaultCharset().displayName() );
267            StringRequestEntity re = new StringRequestEntity( s );
268    
269            // FileUtils.writeToFile( "e:/temp/inspire.xml", s );
270    
271            post.setRequestEntity( re );
272            HttpClient client = new HttpClient();
273            client.executeMethod( post );
274            s = post.getResponseBodyAsString();
275            if ( s.toLowerCase().indexOf( "exception" ) > -1 ) {
276                ExceptionBean eb = new ExceptionBean( getClass().getName(), "insert failed" );
277                responseHandler.writeAndClose( true, eb );
278            } else {
279                responseHandler.writeAndClose( "insert performed" );
280            }
281    
282            return s;
283        }
284    
285        protected void setContact( MDMetadata mdMetadata, MetadataBean bean ) {
286            Contact contact = mdMetadata.getContact();
287            CIResponsibleParty respParty = contact.getCIResponsibleParty();
288            respParty.getIndividualName().setCharacterString( bean.getContactIndividualName() );
289            respParty.getOrganisationName().setCharacterString( bean.getContactOrganisationName() );
290            respParty.getRole().getCIRoleCode().setCodeListValue( bean.getContactRole() );
291            ContactInfo ci = respParty.getContactInfo();
292            Phone phone = ci.getCIContact().getPhone();
293            phone.getCITelephone().getFacsimile().setCharacterString( bean.getContactFacsimile() );
294            phone.getCITelephone().getVoice().setCharacterString( bean.getContactVoice() );
295            Address address = ci.getCIContact().getAddress();
296            address.getCIAddress().getCity().setCharacterString( bean.getContactCity() );
297            address.getCIAddress().getCountry().setCharacterString( bean.getContactCountry() );
298            address.getCIAddress().getDeliveryPoint().setCharacterString( bean.getContactDeliveryPoint() );
299            address.getCIAddress().getElectronicMailAddress().setCharacterString( bean.getContactEmailAddress() );
300            address.getCIAddress().getPostalCode().setCharacterString( bean.getContactPostalCode() );
301        }
302    
303        protected void setExtent( MDDataIdentification mdDataId, MetadataBean bean )
304                                throws CRSTransformationException {
305            EXExtent extent = mdDataId.getExtent().getEXExtent();
306            extent.getDescription().setCharacterString( getGeogrDesc( bean.getGeogrDescription() ) );
307            EXTemporalExtent te = extent.getTemporalElement().getEXTemporalExtent();
308            TimePeriod tp = te.getExtent().getTimePeriod();
309    
310            tp.setBeginPosition( bean.getBegin() );
311            tp.setEndPosition( bean.getEnd() );
312            EXGeographicBoundingBox bbox = extent.getGeographicElement().getEXGeographicBoundingBox();
313            Envelope env = getEnvelope( bean.getGeogrDescription() );
314            bbox.getWestBoundLongitude().setDecimal( (float) env.getMin().getX() );
315            bbox.getSouthBoundLatitude().setDecimal( (float) env.getMin().getY() );
316            bbox.getEastBoundLongitude().setDecimal( (float) env.getMax().getX() );
317            bbox.getNorthBoundLatitude().setDecimal( (float) env.getMax().getY() );
318        }
319    
320        /**
321         * @param geographicIdentifier
322         * @return
323         */
324        private String getGeogrDesc( String geographicIdentifier ) {
325            List<SpatialExtent> extents = conf.getSpatialExtents();
326            for ( SpatialExtent spatialExtent : extents ) {
327                if ( spatialExtent.getId().equalsIgnoreCase( geographicIdentifier ) ) {
328                    return spatialExtent.getName();
329                }
330            }
331            return "-";
332        }
333    
334        protected Envelope getEnvelope( String geogrDescription )
335                                throws CRSTransformationException {
336            List<SpatialExtent> spatialExtents = conf.getSpatialExtents();
337            String bbox = "-180,-90,180,90";
338            for ( SpatialExtent spatialExtent : spatialExtents ) {
339                if ( spatialExtent.getId().equals( geogrDescription ) ) {
340                    bbox = spatialExtent.getBbox();
341                    break;
342                }
343            }
344            return GeometryFactory.createEnvelope( bbox, crs );
345        }
346    
347        protected void setPointOfContact( MDDataIdentification mdDataId, MetadataBean bean ) {
348            PointOfContact poc = mdDataId.getPointOfContact();
349            CIResponsibleParty respParty = poc.getCIResponsibleParty();
350            respParty.getIndividualName().setCharacterString( bean.getPocIndividualName() );
351            respParty.getOrganisationName().setCharacterString( bean.getPocOrganisationName() );
352            respParty.getRole().getCIRoleCode().setCodeListValue( bean.getPocRole() );
353            ContactInfo ci = respParty.getContactInfo();
354            Phone phone = ci.getCIContact().getPhone();
355            phone.getCITelephone().getFacsimile().setCharacterString( bean.getPocFacsimile() );
356            phone.getCITelephone().getVoice().setCharacterString( bean.getPocVoice() );
357            Address address = ci.getCIContact().getAddress();
358            address.getCIAddress().getCity().setCharacterString( bean.getPocCity() );
359            address.getCIAddress().getCountry().setCharacterString( bean.getPocCountry() );
360            address.getCIAddress().getDeliveryPoint().setCharacterString( bean.getPocDeliveryPoint() );
361            address.getCIAddress().getElectronicMailAddress().setCharacterString( bean.getPocEmailAddress() );
362            address.getCIAddress().getPostalCode().setCharacterString( bean.getPocPostalCode() );
363        }
364    
365        @SuppressWarnings("unchecked")
366        protected void setKeywords( MDDataIdentification mdDataId, MetadataBean bean ) {
367            List<Keyword> list = mdDataId.getDescriptiveKeywords().getMDKeywords().getKeyword();
368            list.clear();
369            List<String> kw = bean.getKeywords();
370            for ( String keyword : kw ) {
371                Keyword key = new Keyword();
372                key.setCharacterString( keyword );
373                list.add( key );
374            }
375            Keyword key = new Keyword();
376            key.setCharacterString( bean.getInspireDataTheme() );
377            list.add( key );
378        }
379    
380        protected void addDate( List<Date> dates, String type, String value ) {
381            Date date = new Date();
382            CIDate cidate = new CIDate();
383            cidate.setDate( date );
384            DateType dt = new DateType();
385            CIDateTypeCode dtc = new CIDateTypeCode();
386            dtc.setCodeList( "http://www.isotc211.org/2005/resources/codeList.xml#CI_DateTypeCode" );
387            dtc.setCodeListValue( type );
388            dt.setCIDateTypeCode( dtc );
389            cidate.setDateType( dt );
390            Date dateValue = new Date();
391            dateValue.setDateTime( value + "T00:00:00Z" );
392            cidate.setDate( dateValue );
393            date.setCIDate( cidate );
394            dates.add( date );
395        }
396    
397    }