/******************************************************************************* * Gisgraphy Project * * 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 * * Copyright 2008 Gisgraphy project * David Masclet <davidmasclet@gisgraphy.com> * * *******************************************************************************/ /** * */ package com.gisgraphy.domain.valueobject; import java.io.ByteArrayOutputStream; import java.io.UnsupportedEncodingException; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.List; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Marshaller; import javax.xml.bind.PropertyException; import static org.junit.Assert.*; import net.sf.jstester.util.Assert; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import com.gisgraphy.domain.geoloc.entity.GisFeature; import com.gisgraphy.domain.repository.IGisDao; import com.gisgraphy.fulltext.AbstractIntegrationHttpSolrTestCase; import com.gisgraphy.helper.IntrospectionHelper; import com.gisgraphy.helper.URLUtils; import com.gisgraphy.test.FeedChecker; import com.gisgraphy.test.GisgraphyTestHelper; public class GisFeatureDistanceFactoryTest extends AbstractIntegrationHttpSolrTestCase { @Autowired protected IGisDao<? extends GisFeature>[] daos; @Test public void testGisFeatureDistanceShouldBeMappedWithJAXBAndHaveCalculatedFieldsWhenConstructWithGisFeatureAndDistance() { GisFeatureDistance gisfeatureDistance = null; try { JAXBContext context = JAXBContext .newInstance(GisFeatureDistance.class); Marshaller m = context.createMarshaller(); m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); gisfeatureDistance = GisgraphyTestHelper .createFullFilledGisFeatureDistanceWithFactory(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); m.marshal(gisfeatureDistance, outputStream); FeedChecker.checkGisFeatureDistanceJAXBMapping(gisfeatureDistance, outputStream.toString(Constants.CHARSET),""); checkupdateFields(gisfeatureDistance); } catch (PropertyException e) { fail(e.getMessage()); } catch (JAXBException e) { fail(e.getMessage()); } catch (UnsupportedEncodingException e) { fail(e.getMessage()); } } private void checkupdateFields(GisFeatureDistance gisfeatureDistance){ String gMapsURL = URLUtils.createGoogleMapUrl(gisfeatureDistance.getLocation()); String yahooMapsUrl = URLUtils.createYahooMapUrl(gisfeatureDistance.getLocation()); String openstreetmapMapsUrl = URLUtils.createOpenstreetmapMapUrl(gisfeatureDistance.getLocation()); String countryflagurl = URLUtils.createCountryFlagUrl(gisfeatureDistance.getCountryCode()); double lat = gisfeatureDistance.getLocation().getY(); double lng = gisfeatureDistance.getLocation().getX(); String placetype="city"; Assert.assertEquals(gMapsURL, gisfeatureDistance.getGoogle_map_url()); Assert.assertEquals(yahooMapsUrl, gisfeatureDistance.getYahoo_map_url()); Assert.assertEquals(openstreetmapMapsUrl, gisfeatureDistance.getOpensteetmap_map_url()); Assert.assertEquals(countryflagurl, gisfeatureDistance.getCountry_flag_url()); Assert.assertEquals(lat, gisfeatureDistance.getLat()); Assert.assertEquals(lng, gisfeatureDistance.getLng()); Assert.assertEquals(placetype, gisfeatureDistance.getPlaceType()); } @Test public void testGisFeatureDistanceShouldHaveCountryInfos() { GisFeatureDistance gisFeatureDistance = null; try { JAXBContext context = JAXBContext .newInstance(GisFeatureDistance.class); Marshaller m = context.createMarshaller(); m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); GisFeatureDistanceFactory factory = new GisFeatureDistanceFactory(); gisFeatureDistance = factory.fromCountry(GisgraphyTestHelper.createFullFilledCountry(), 3D); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); m.marshal(gisFeatureDistance, outputStream); FeedChecker.checkGisFeatureDistanceJAXBMapping(gisFeatureDistance, outputStream.toString(Constants.CHARSET),""); String streamToString = outputStream.toString(Constants.CHARSET); FeedChecker.assertQ("area should be filled if The GisFeature is a Country", streamToString, "/" + GisFeatureDistance.GISFEATUREDISTANCE_JAXB_NAME + "/area[.='" + gisFeatureDistance.getArea() + "']", "/" + GisFeatureDistance.GISFEATUREDISTANCE_JAXB_NAME + "/tld[.='" + gisFeatureDistance.getTld() + "']", "/" + GisFeatureDistance.GISFEATUREDISTANCE_JAXB_NAME + "/capitalName[.='" + gisFeatureDistance.getCapitalName() + "']", "/" + GisFeatureDistance.GISFEATUREDISTANCE_JAXB_NAME + "/continent[.='" + gisFeatureDistance.getContinent() + "']", "/"+ GisFeatureDistance.GISFEATUREDISTANCE_JAXB_NAME + "/postalCodeRegex[.='" + gisFeatureDistance.getPostalCodeRegex() + "']", "/"+ GisFeatureDistance.GISFEATUREDISTANCE_JAXB_NAME + "/currencyCode[.='" + gisFeatureDistance.getCurrencyCode() + "']", "/"+ GisFeatureDistance.GISFEATUREDISTANCE_JAXB_NAME + "/currencyName[.='" + gisFeatureDistance.getCurrencyName() + "']", "/"+ GisFeatureDistance.GISFEATUREDISTANCE_JAXB_NAME + "/equivalentFipsCode[.='" + gisFeatureDistance.getEquivalentFipsCode() + "']", "/"+ GisFeatureDistance.GISFEATUREDISTANCE_JAXB_NAME + "/fipsCode[.='" + gisFeatureDistance.getFipsCode() + "']", "/"+ GisFeatureDistance.GISFEATUREDISTANCE_JAXB_NAME + "/iso3166Alpha2Code[.='" + gisFeatureDistance.getIso3166Alpha2Code() + "']", "/"+ GisFeatureDistance.GISFEATUREDISTANCE_JAXB_NAME + "/iso3166Alpha3Code[.='" + gisFeatureDistance.getIso3166Alpha3Code() + "']", "/"+ GisFeatureDistance.GISFEATUREDISTANCE_JAXB_NAME + "/iso3166NumericCode[.='" + gisFeatureDistance.getIso3166NumericCode() + "']", "/"+ GisFeatureDistance.GISFEATUREDISTANCE_JAXB_NAME + "/phonePrefix[.='" + gisFeatureDistance.getPhonePrefix() + "']", "/"+ GisFeatureDistance.GISFEATUREDISTANCE_JAXB_NAME + "/postalCodeMask[.='" + gisFeatureDistance.getPostalCodeMask() + "']"); checkupdateFields(gisFeatureDistance); } catch (PropertyException e) { fail(e.getMessage()); } catch (JAXBException e) { fail(e.getMessage()); } catch (UnsupportedEncodingException e) { fail("unsupported encoding for " + Constants.CHARSET); } } @Test public void testGisFeatureDistanceShouldHaveLevelIfGisFeatureIsAdm() { GisFeatureDistance gisFeatureDistance = null; try { JAXBContext context = JAXBContext .newInstance(GisFeatureDistance.class); Marshaller m = context.createMarshaller(); m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); gisFeatureDistance = GisgraphyTestHelper .createFullFilledGisFeatureDistanceForAdmWithFactory(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); m.marshal(gisFeatureDistance, outputStream); FeedChecker.checkGisFeatureDistanceJAXBMapping(gisFeatureDistance, outputStream.toString(Constants.CHARSET),""); FeedChecker.assertQ("level should be output if The GisFeature is an Adm", outputStream.toString(Constants.CHARSET), "/" + GisFeatureDistance.GISFEATUREDISTANCE_JAXB_NAME + "/level[.='" + gisFeatureDistance.getLevel() + "']"); checkupdateFields(gisFeatureDistance); } catch (PropertyException e) { fail(e.getMessage()); } catch (JAXBException e) { fail(e.getMessage()); } catch (UnsupportedEncodingException e) { fail("unsupported encoding for " + Constants.CHARSET); } } @Test public void testGisFeatureDistanceShouldBeCorrectlyFullFilledGisFeatureIsStreet() { GisFeatureDistance gisFeatureDistance = null; try { JAXBContext context = JAXBContext .newInstance(GisFeatureDistance.class); Marshaller m = context.createMarshaller(); m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); gisFeatureDistance = GisgraphyTestHelper .createFullFilledGisFeatureDistanceForStreetWithFactory(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); m.marshal(gisFeatureDistance, outputStream); FeedChecker.checkGisFeatureDistanceJAXBMapping(gisFeatureDistance, outputStream.toString(Constants.CHARSET),""); FeedChecker.assertQ("wrong feed for street", outputStream.toString(Constants.CHARSET), "/" + GisFeatureDistance.GISFEATUREDISTANCE_JAXB_NAME + "/length[.='" + gisFeatureDistance.getLength() + "']", "/" + GisFeatureDistance.GISFEATUREDISTANCE_JAXB_NAME + "/streetType[.='" + gisFeatureDistance.getStreetType()+ "']", "/" + GisFeatureDistance.GISFEATUREDISTANCE_JAXB_NAME + "/oneWay[.='" + gisFeatureDistance.isOneWay() + "']", "/" + GisFeatureDistance.GISFEATUREDISTANCE_JAXB_NAME + "/isInAdm[.='" + gisFeatureDistance.getIsInAdm() + "']", "/" + GisFeatureDistance.GISFEATUREDISTANCE_JAXB_NAME + "/isInPlace[.='" + gisFeatureDistance.getIsInPlace() + "']", "/" + GisFeatureDistance.GISFEATUREDISTANCE_JAXB_NAME + "/isInZip[.='" + gisFeatureDistance.getIsInZip() + "']", "/" + GisFeatureDistance.GISFEATUREDISTANCE_JAXB_NAME + "/toll[.='" + gisFeatureDistance.isToll() + "']", "/" + GisFeatureDistance.GISFEATUREDISTANCE_JAXB_NAME + "/lanes[.='" + gisFeatureDistance.getLanes() + "']", "/" + GisFeatureDistance.GISFEATUREDISTANCE_JAXB_NAME + "/maxSpeed[.='" + gisFeatureDistance.getMaxSpeed() + "']", "/" + GisFeatureDistance.GISFEATUREDISTANCE_JAXB_NAME + "/maxSpeedBackward[.='" + gisFeatureDistance.getMaxSpeedBackward() + "']", "/" + GisFeatureDistance.GISFEATUREDISTANCE_JAXB_NAME + "/azimuthStart[.='" + gisFeatureDistance.getAzimuthStart() + "']", "/" + GisFeatureDistance.GISFEATUREDISTANCE_JAXB_NAME + "/azimuthEnd[.='" + gisFeatureDistance.getAzimuthEnd() + "']", "/" + GisFeatureDistance.GISFEATUREDISTANCE_JAXB_NAME + "/streetRef[.='" + gisFeatureDistance.getStreetRef() + "']", "/" + GisFeatureDistance.GISFEATUREDISTANCE_JAXB_NAME + "/surface[.='" + gisFeatureDistance.getSurface() + "']", "/" + GisFeatureDistance.GISFEATUREDISTANCE_JAXB_NAME + "/openstreetmapId[.='" + gisFeatureDistance.getOpenstreetmapId() + "']", "/"+ GisFeatureDistance.GISFEATUREDISTANCE_JAXB_NAME + "/isIn[.='" + gisFeatureDistance.getIsIn() + "']"); checkupdateFields(gisFeatureDistance); } catch (PropertyException e) { fail(e.getMessage()); } catch (JAXBException e) { fail(e.getMessage()); } catch (UnsupportedEncodingException e) { fail("unsupported encoding for " + Constants.CHARSET); } } @Test public void testGisFeatureDistanceShouldHaveZipCode() { GisFeatureDistance result = null; try { JAXBContext context = JAXBContext .newInstance(GisFeatureDistance.class); Marshaller m = context.createMarshaller(); m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); result = GisgraphyTestHelper .createFullFilledGisFeatureDistanceForCityWithFactory(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); m.marshal(result, outputStream); String resultAsString = outputStream.toString(Constants.CHARSET); FeedChecker.checkGisFeatureDistanceJAXBMapping(result, resultAsString,""); for (String zipCode: result.getZipCodes()){ FeedChecker.assertQ("Zipcode should be output ", resultAsString, "/" + GisFeatureDistance.GISFEATUREDISTANCE_JAXB_NAME + "/zipCodes/zipCode[.='" + zipCode + "']"); } } catch (PropertyException e) { fail(e.getMessage()); } catch (JAXBException e) { fail(e.getMessage()); } catch (UnsupportedEncodingException e) { fail("unsupported encoding for " + Constants.CHARSET); } } @Test public void testGisFeatureDistanceShouldHaveAllThefieldOfClassThatExtendsGisFeature() { List<Class<? extends GisFeature>> classList = new ArrayList<Class<? extends GisFeature>>(); for (int i = 0; i < daos.length; i++) { classList.add(daos[i].getPersistenceClass()); } List<String> GisFeatureDistanceFields = inspectGisFeatureDistance(); for (Class<? extends GisFeature> gisClass : classList) { for (String field : IntrospectionHelper.getFieldsAsList(gisClass)){ assertTrue("GisFeatureDistance does not contain "+field+ " and should because "+gisClass+" has this field",GisFeatureDistanceFields.contains(field)); } } } private List<String> inspectGisFeatureDistance(){ Class<?> clazzParent = GisFeatureDistance.class; List<String> introspectedFields = new ArrayList<String>(); do { int searchMods = 0x0; searchMods |= modifierFromString("private"); Field[] flds = clazzParent.getDeclaredFields(); for (Field f : flds) { int foundMods = f.getModifiers(); if ((foundMods & searchMods) == searchMods && !f.isSynthetic() && f.getType() != List.class && !Modifier.isFinal(foundMods)) { introspectedFields.add(f.getName()); } } clazzParent = (Class<?>) clazzParent.getSuperclass(); } while (clazzParent != Object.class); return introspectedFields; } private static int modifierFromString(String s) { int m = 0x0; if ("public".equals(s)) m |= Modifier.PUBLIC; else if ("protected".equals(s)) m |= Modifier.PROTECTED; else if ("private".equals(s)) m |= Modifier.PRIVATE; else if ("static".equals(s)) m |= Modifier.STATIC; else if ("final".equals(s)) m |= Modifier.FINAL; else if ("transient".equals(s)) m |= Modifier.TRANSIENT; else if ("volatile".equals(s)) m |= Modifier.VOLATILE; return m; } }