package org.geotools.metadata; import java.io.FileInputStream; import java.io.InputStream; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.Locale; import java.util.Map; import java.util.Properties; import java.util.ResourceBundle; import org.geotools.metadata.iso.citation.CitationImpl; import org.geotools.metadata.iso.citation.Citations; import org.geotools.metadata.iso.citation.ResponsiblePartyImpl; import org.geotools.metadata.iso.citation.TelephoneImpl; import org.geotools.referencing.crs.DefaultGeographicCRS; import org.geotools.text.Text; import org.geotools.util.GrowableInternationalString; import org.geotools.util.NumberRange; import org.geotools.util.Range; import org.geotools.util.ResourceInternationalString; import org.geotools.util.SimpleInternationalString; import org.geotools.util.Utilities; import org.opengis.metadata.citation.Citation; import org.opengis.metadata.citation.ResponsibleParty; import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.opengis.util.InternationalString; public class MetadataExamples { public static void main(String args[]) { MetadataExamples examples = new MetadataExamples(); examples.exampleRange(); examples.referenceDocument(Citations.EPSG); examples.referenceDocument(Citations.OGC); examples.referenceDocument(Citations.ORACLE); examples.exampleCitation(examples); examples.telephone(); examples.wkt(); } private void exampleUtilities() { String string1 = null; String string2 = null; Object object = null; Object value = null; int seed = 0; // exampleUtilities start // equals provides a null safe equals check Utilities.equals(string1, string2); // null safe equals check Utilities.equals(null, "Hello"); // false Utilities.equals(null, null); // true! // deepEquals will check the contents of arrays Utilities.deepEquals(new double[] { 1.0 }, new double[] { 1.0 }); // deepToString will print out objects and arrays Utilities.deepToString(new double[] { 1.0, Math.PI, Math.E }); // when implementing your own object the following are handy Utilities.hash(value, seed); Utilities.equals(value, object); Utilities.ensureNonNull("parameter", object); // exampleUtilities end } private void exampleCitation(MetadataExamples examples) { CitationImpl citation = new CitationImpl(); citation.setEditionDate(new Date()); // today Collection<ResponsibleParty> parties = Collections.singleton(ResponsiblePartyImpl.GEOTOOLS); citation.setCitedResponsibleParties(parties); referenceDocument(Citations.ORACLE); } private void referenceDocument(Citation citation) { System.out.println(citation.getTitle()); System.out.println(citation.getTitle().toString(Locale.FRENCH)); System.out.println(citation.getIdentifiers()); System.out.println(citation.getAlternateTitles()); } private void telephone() { TelephoneImpl phone = new TelephoneImpl(); phone.setVoices(Collections.singleton("555-1234")); phone.setFacsimiles(Collections.singleton("555-2FAX")); System.out.println(phone); } private void wkt() { CoordinateReferenceSystem crs = DefaultGeographicCRS.WGS84; System.out.println(crs.toWKT()); } private void exampleRange() { // exampleRange start // simple range of one value Range<Double> zero = new Range<Double>(Double.class, 0.0); System.out.println(zero); // [0.0, 0.0] // range include two values Range<Double> from1to5 = new Range<Double>(Double.class, 1.0, 5.0); System.out.println(from1to5); // [1.0, 5.0] // range from one value up to a limit Range<Double> from1upto10 = new Range<Double>(Double.class, 1.0, true, 10.0, false); System.out.println(from1upto10); // [1.0, 10.0) // range between two values Range<Double> between6and8 = new Range<Double>(Double.class, 6.0, false, 8.0, false); System.out.println(between6and8); // (6.0, 8.0) // range details from1to5.getMinValue(); from1to5.isMinIncluded(); from1to5.getMaxValue(); from1to5.isMaxIncluded(); // range operations from1upto10.subtract(between6and8); // returns two ranges from1upto10.subtract(from1to5); // returns one range from1to5.union(between6and8); // returns [1.0,8.0) // range check from1to5.contains(3.0); // true from1upto10.contains(between6and8); // true // exampleRange end } private void exampleRangeComparable() { // exampleRangeComparable start Range<Date> today = new Range<Date>(Date.class, new Date()); // exampleRangeComparable end } private void exampleNumberRange() { // exampleNumberRange start NumberRange<Double> positive = NumberRange.create(0.0, Double.MAX_VALUE); NumberRange<Double> negative = NumberRange.create(0.0, false, Double.MIN_VALUE, true); NumberRange<Integer> decimal = NumberRange.create(1, 10); positive.contains(decimal); positive.contains((Number) 3.0); // test double positive.contains((Number) 3); // test integer // exampleNumberRange end } // // Text // private void examleText() throws Exception { // exampleText start InternationalString greeting; // simple text place holder greeting = Text.text("hello world"); // translated text for an internationalized application // useful as message.properties, message_fr.properties etc can be translated // outside of your application greeting = Text.text("greeting", "message.properties"); // the next method is good for quickly doing things as a developer Map<String,String> translations = new HashMap<String,String>(); translations.put("greeting", "Hello World"); translations.put( "greeting_it", "ciao mondo"); greeting = Text.text("greeting", translations ); // you can actually use the same map to configure several international strings // (each string will only pick up the entries with a matching key) // // With that in mind we make a special effort to allow you to use properties Properties properties = new Properties(); properties.load( new FileInputStream("message.properties") ); InternationalString title = Text.text( "title", properties ); InternationalString description = Text.text( "description", properties ); // exampleText end } private void exampleResourceInternationalString() { // exampleResourceInternationalString start ResourceInternationalString greeting = new ResourceInternationalString("message.properties", "greeting"); System.out.println(greeting); // will output best match to current Locale System.out.println(greeting.toString(Locale.CANADA_FRENCH)); // should output best match // Note the "messages.properties" above is used with Java ResourceBundle // In a manner similar to this ResourceBundle.getBundle("message.properties", Locale.getDefault()).getString("greeting"); // exampleResourceInternationalString end } private void exampleSimpleInternationalStirng() { // exampleSimpleInternationalStirng start SimpleInternationalString greeting = new SimpleInternationalString("Hello World"); System.out.println(greeting); // will output best match to current System.out.println(greeting.toString(Locale.FRENCH)); // but since there is only one... // exampleSimpleInternationalStirng end } private void exampleGrowableInternationalString() { // exampleGrowableInternationalString start GrowableInternationalString greeting = new GrowableInternationalString(); // Make use of Locale when adding translations greeting.add(Locale.ENGLISH, "Hello World"); greeting.add(Locale.FRENCH, "Bonjour tout le monde"); greeting.add("fr", "greeting", ""); System.out.println(greeting); // will output best match to current Locale System.out.println(greeting.toString(Locale.CANADA_FRENCH)); // should output best match // You can also use strings to avoid creating Locale objects right away // The method references a "key" which is handy when processing property files greeting.add("key_en", "key", "Hello World"); greeting.add("key_fr", "key", "Bonjour tot le monde"); // You can also quickly create an GrowableInternationalString and add to it later GrowableInternationalString cheerfulGreeting = new GrowableInternationalString("G'Day"); cheerfulGreeting.add(Locale.UK, "Welcome"); cheerfulGreeting.add(Locale.US, "Hello"); // exampleGrowableInternationalString end } }