From 50de989a8e2a17476a7a789fce1a10c61d9cb957 Mon Sep 17 00:00:00 2001 From: Chad Johnson Date: Tue, 12 Feb 2019 20:35:05 -0700 Subject: [PATCH 1/6] Added the ability to ignore conversion errors when building StructuredData by setting structuredData.ignoreConversionErrors=true --- .../sdk/indexing/StructuredData.java | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/indexing/src/main/java/com/google/enterprise/cloudsearch/sdk/indexing/StructuredData.java b/indexing/src/main/java/com/google/enterprise/cloudsearch/sdk/indexing/StructuredData.java index d16ef57..68d6f03 100644 --- a/indexing/src/main/java/com/google/enterprise/cloudsearch/sdk/indexing/StructuredData.java +++ b/indexing/src/main/java/com/google/enterprise/cloudsearch/sdk/indexing/StructuredData.java @@ -116,6 +116,8 @@ public class StructuredData { public static final String DATETIME_PATTERNS = "structuredData.dateTimePatterns"; public static final String LOCAL_SCHEMA = "structuredData.localSchema"; + public static final String IGNORE_CONVERSION_ERRORS = "structuredData.ignoreConversionErrors"; + private static final String DATETIME_PATTERNS_DELIMITER = ";"; private static final ImmutableList DEFAULT_DATETIME_PARSERS = ImmutableList.of( @@ -129,6 +131,7 @@ public class StructuredData { private static final AtomicBoolean initialized = new AtomicBoolean(); private static final List dateTimeParsers = new ArrayList<>(); + private static boolean ignoreConversionErrors = false; /** A map from object definition names to instances of this class. */ private static final Map structuredDataMapping = @@ -177,6 +180,8 @@ public static synchronized void initFromConfiguration(IndexingService indexingSe throw patternErrors; } + ignoreConversionErrors = Configuration.getBoolean(IGNORE_CONVERSION_ERRORS, Boolean.FALSE).get(); + Schema schema; String localSchemaPath = Configuration.getString(LOCAL_SCHEMA, "").get(); if (!localSchemaPath.isEmpty()) { @@ -354,16 +359,21 @@ private NamedProperty getProperty(String propertyName, Collection values if (nonNullValues.isEmpty()) { return null; } - if (!isRepeated) { - return propertyBuilder.getNamedProperty( - propertyName, Collections.singletonList(valueConverter.convert(nonNullValues.get(0)))); - } else { - return propertyBuilder.getNamedProperty( - propertyName, - nonNullValues - .stream() - .map(v -> valueConverter.convert(v)) - .collect(Collectors.toList())); + try { + if (!isRepeated) { + return propertyBuilder.getNamedProperty( + propertyName, Collections.singletonList(valueConverter.convert(nonNullValues.get(0)))); + } else { + return propertyBuilder.getNamedProperty( + propertyName, + nonNullValues + .stream() + .map(v -> valueConverter.convert(v)) + .collect(Collectors.toList())); + } + } catch (IllegalArgumentException e) { + if(ignoreConversionErrors) return null; + throw e; } } } From f9e294736d69d9f432cf7acdf3db43943c9f9a91 Mon Sep 17 00:00:00 2001 From: Chad Johnson Date: Wed, 27 Feb 2019 14:37:57 -0700 Subject: [PATCH 2/6] Update indexing/src/main/java/com/google/enterprise/cloudsearch/sdk/indexing/StructuredData.java --- .../enterprise/cloudsearch/sdk/indexing/StructuredData.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/indexing/src/main/java/com/google/enterprise/cloudsearch/sdk/indexing/StructuredData.java b/indexing/src/main/java/com/google/enterprise/cloudsearch/sdk/indexing/StructuredData.java index 68d6f03..2a0f218 100644 --- a/indexing/src/main/java/com/google/enterprise/cloudsearch/sdk/indexing/StructuredData.java +++ b/indexing/src/main/java/com/google/enterprise/cloudsearch/sdk/indexing/StructuredData.java @@ -372,7 +372,10 @@ private NamedProperty getProperty(String propertyName, Collection values .collect(Collectors.toList())); } } catch (IllegalArgumentException e) { - if(ignoreConversionErrors) return null; + if(ignoreConversionErrors) { + logger.log(Level.FINEST, "Ignoring conversion error: {0}", e.getMessage()); + return null; + } throw e; } } From 5bf06104d7ec43253f2665d479aebefde26acff8 Mon Sep 17 00:00:00 2001 From: Chad Johnson Date: Wed, 27 Feb 2019 15:33:13 -0700 Subject: [PATCH 3/6] Added logging when a conversion error is ignored. Changed logic for repeating properties, so only bad values are rejected, the rest are kept. --- .../sdk/indexing/StructuredData.java | 48 +++++++++++++------ 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/indexing/src/main/java/com/google/enterprise/cloudsearch/sdk/indexing/StructuredData.java b/indexing/src/main/java/com/google/enterprise/cloudsearch/sdk/indexing/StructuredData.java index 68d6f03..8b8b227 100644 --- a/indexing/src/main/java/com/google/enterprise/cloudsearch/sdk/indexing/StructuredData.java +++ b/indexing/src/main/java/com/google/enterprise/cloudsearch/sdk/indexing/StructuredData.java @@ -131,7 +131,7 @@ public class StructuredData { private static final AtomicBoolean initialized = new AtomicBoolean(); private static final List dateTimeParsers = new ArrayList<>(); - private static boolean ignoreConversionErrors = false; + private static final AtomicBoolean ignoreConversionErrors = new AtomicBoolean(); /** A map from object definition names to instances of this class. */ private static final Map structuredDataMapping = @@ -180,7 +180,7 @@ public static synchronized void initFromConfiguration(IndexingService indexingSe throw patternErrors; } - ignoreConversionErrors = Configuration.getBoolean(IGNORE_CONVERSION_ERRORS, Boolean.FALSE).get(); + ignoreConversionErrors.set(Configuration.getBoolean(IGNORE_CONVERSION_ERRORS, Boolean.FALSE).get()); Schema schema; String localSchemaPath = Configuration.getString(LOCAL_SCHEMA, "").get(); @@ -355,24 +355,44 @@ private ValueExtractor( private NamedProperty getProperty(String propertyName, Collection values) { List nonNullValues = - values.stream().filter(Objects::nonNull).collect(Collectors.toList()); + values.stream().filter(Objects::nonNull).collect(Collectors.toList()); if (nonNullValues.isEmpty()) { return null; } - try { - if (!isRepeated) { - return propertyBuilder.getNamedProperty( - propertyName, Collections.singletonList(valueConverter.convert(nonNullValues.get(0)))); - } else { + if (!isRepeated) { + try { return propertyBuilder.getNamedProperty( - propertyName, - nonNullValues - .stream() - .map(v -> valueConverter.convert(v)) - .collect(Collectors.toList())); + propertyName, Collections.singletonList(valueConverter.convert(nonNullValues.get(0)))); + } catch (IllegalArgumentException e) { + if (ignoreConversionErrors.get()) { + logger.log(Level.FINEST, "Ignoring conversion error: {0}", e.getMessage()); + return null; + } + throw e; + } + } else { + List nonNullConvertedValues = nonNullValues + .stream() + .map(v -> convert(valueConverter, v)) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + if(nonNullConvertedValues.isEmpty()) { + return null; } + return propertyBuilder.getNamedProperty( + propertyName, + nonNullConvertedValues); + } + } + + private T convert(Converter converter, Object v) { + try { + return converter.convert(v); } catch (IllegalArgumentException e) { - if(ignoreConversionErrors) return null; + if(ignoreConversionErrors.get()) { + logger.log(Level.FINEST, "Ignoring conversion error: {0}", e.getMessage()); + return null; + } throw e; } } From 4b2f7b1a2b13baa0bbaa2b3874804d1476e0087e Mon Sep 17 00:00:00 2001 From: Chad Johnson Date: Fri, 17 May 2019 14:23:51 -0600 Subject: [PATCH 4/6] Added test case. I had to add setter for the configuration member because I could not call init(Schema) and initFromConfiguration(indexingService) in the same test case. --- .../sdk/indexing/StructuredData.java | 55 +++++-------- .../sdk/indexing/StructuredDataTest.java | 80 ++++++++----------- 2 files changed, 53 insertions(+), 82 deletions(-) diff --git a/indexing/src/main/java/com/google/enterprise/cloudsearch/sdk/indexing/StructuredData.java b/indexing/src/main/java/com/google/enterprise/cloudsearch/sdk/indexing/StructuredData.java index 58af07c..35deaa3 100644 --- a/indexing/src/main/java/com/google/enterprise/cloudsearch/sdk/indexing/StructuredData.java +++ b/indexing/src/main/java/com/google/enterprise/cloudsearch/sdk/indexing/StructuredData.java @@ -15,29 +15,11 @@ */ package com.google.enterprise.cloudsearch.sdk.indexing; -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.base.Preconditions.checkState; -import static java.nio.charset.Charset.defaultCharset; - import com.google.api.client.json.JsonObjectParser; import com.google.api.client.json.jackson2.JacksonFactory; import com.google.api.client.util.DateTime; -import com.google.api.services.cloudsearch.v1.model.DateValues; -import com.google.api.services.cloudsearch.v1.model.DoubleValues; -import com.google.api.services.cloudsearch.v1.model.EnumPropertyOptions; -import com.google.api.services.cloudsearch.v1.model.EnumValuePair; -import com.google.api.services.cloudsearch.v1.model.EnumValues; -import com.google.api.services.cloudsearch.v1.model.HtmlValues; -import com.google.api.services.cloudsearch.v1.model.IntegerValues; -import com.google.api.services.cloudsearch.v1.model.NamedProperty; -import com.google.api.services.cloudsearch.v1.model.ObjectDefinition; -import com.google.api.services.cloudsearch.v1.model.ObjectValues; -import com.google.api.services.cloudsearch.v1.model.PropertyDefinition; -import com.google.api.services.cloudsearch.v1.model.Schema; -import com.google.api.services.cloudsearch.v1.model.StructuredDataObject; -import com.google.api.services.cloudsearch.v1.model.TextValues; -import com.google.api.services.cloudsearch.v1.model.TimestampValues; +import com.google.api.services.cloudsearch.v1.model.*; +import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Converter; import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; @@ -47,6 +29,10 @@ import com.google.enterprise.cloudsearch.sdk.InvalidConfigurationException; import com.google.enterprise.cloudsearch.sdk.StartupException; import com.google.enterprise.cloudsearch.sdk.config.Configuration; +import org.junit.rules.TestRule; +import org.junit.runner.Description; +import org.junit.runners.model.Statement; + import java.io.IOException; import java.io.InputStreamReader; import java.nio.file.Files; @@ -63,26 +49,15 @@ import java.time.format.ResolverStyle; import java.time.temporal.TemporalAccessor; import java.time.temporal.TemporalQueries; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Collection; -import java.util.Collections; import java.util.Date; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; -import java.util.TimeZone; +import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Level; import java.util.logging.Logger; import java.util.stream.Collectors; -import org.junit.rules.TestRule; -import org.junit.runner.Description; -import org.junit.runners.model.Statement; + +import static com.google.common.base.Preconditions.*; +import static java.nio.charset.Charset.defaultCharset; /** * Helper utility to generate a {@link StructuredDataObject}. @@ -132,6 +107,7 @@ public class StructuredData { private static final AtomicBoolean initialized = new AtomicBoolean(); private static final List dateTimeParsers = new ArrayList<>(); + private static final AtomicBoolean ignoreConversionErrors = new AtomicBoolean(); /** A map from object definition names to instances of this class. */ @@ -270,6 +246,15 @@ public static boolean hasObjectDefinition(String objectType) { return structuredDataMapping.containsKey(objectType); } + /** + * Same as setting structuredData.ignoreConversionErrors in configuration + * @param ignore + */ + @VisibleForTesting + public static void setIgnoreConversionErrors(boolean ignore) { + ignoreConversionErrors.set(ignore); + } + /** * Generate a {@link StructuredDataObject} for the given object type using the input values. * diff --git a/indexing/src/test/java/com/google/enterprise/cloudsearch/sdk/indexing/StructuredDataTest.java b/indexing/src/test/java/com/google/enterprise/cloudsearch/sdk/indexing/StructuredDataTest.java index 5ef8bd9..776029c 100644 --- a/indexing/src/test/java/com/google/enterprise/cloudsearch/sdk/indexing/StructuredDataTest.java +++ b/indexing/src/test/java/com/google/enterprise/cloudsearch/sdk/indexing/StructuredDataTest.java @@ -15,45 +15,9 @@ */ package com.google.enterprise.cloudsearch.sdk.indexing; -import static java.nio.charset.StandardCharsets.UTF_8; -import static org.hamcrest.CoreMatchers.containsString; -import static org.hamcrest.CoreMatchers.equalTo; -import static org.hamcrest.CoreMatchers.instanceOf; -import static org.hamcrest.CoreMatchers.not; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; -import static org.mockito.Mockito.when; - import com.google.api.client.util.DateTime; -import com.google.api.services.cloudsearch.v1.model.BooleanPropertyOptions; import com.google.api.services.cloudsearch.v1.model.Date; -import com.google.api.services.cloudsearch.v1.model.DatePropertyOptions; -import com.google.api.services.cloudsearch.v1.model.DateValues; -import com.google.api.services.cloudsearch.v1.model.DoublePropertyOptions; -import com.google.api.services.cloudsearch.v1.model.DoubleValues; -import com.google.api.services.cloudsearch.v1.model.EnumPropertyOptions; -import com.google.api.services.cloudsearch.v1.model.EnumValuePair; -import com.google.api.services.cloudsearch.v1.model.EnumValues; -import com.google.api.services.cloudsearch.v1.model.GSuitePrincipal; -import com.google.api.services.cloudsearch.v1.model.HtmlPropertyOptions; -import com.google.api.services.cloudsearch.v1.model.HtmlValues; -import com.google.api.services.cloudsearch.v1.model.IntegerPropertyOptions; -import com.google.api.services.cloudsearch.v1.model.IntegerValues; -import com.google.api.services.cloudsearch.v1.model.NamedProperty; -import com.google.api.services.cloudsearch.v1.model.ObjectDefinition; -import com.google.api.services.cloudsearch.v1.model.ObjectPropertyOptions; -import com.google.api.services.cloudsearch.v1.model.ObjectValues; -import com.google.api.services.cloudsearch.v1.model.Principal; -import com.google.api.services.cloudsearch.v1.model.PropertyDefinition; -import com.google.api.services.cloudsearch.v1.model.Schema; -import com.google.api.services.cloudsearch.v1.model.StructuredDataObject; -import com.google.api.services.cloudsearch.v1.model.TextPropertyOptions; -import com.google.api.services.cloudsearch.v1.model.TextValues; -import com.google.api.services.cloudsearch.v1.model.TimestampPropertyOptions; -import com.google.api.services.cloudsearch.v1.model.TimestampValues; +import com.google.api.services.cloudsearch.v1.model.*; import com.google.common.base.Converter; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; @@ -63,16 +27,6 @@ import com.google.enterprise.cloudsearch.sdk.config.Configuration.ResetConfigRule; import com.google.enterprise.cloudsearch.sdk.config.Configuration.SetupConfigRule; import com.google.enterprise.cloudsearch.sdk.indexing.StructuredData.ResetStructuredDataRule; -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Calendar; -import java.util.Collections; -import java.util.List; -import java.util.Properties; -import java.util.TimeZone; -import java.util.stream.Collectors; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ErrorCollector; @@ -82,6 +36,16 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; +import java.io.File; +import java.io.IOException; +import java.util.*; +import java.util.stream.Collectors; + +import static java.nio.charset.StandardCharsets.UTF_8; +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; +import static org.mockito.Mockito.when; + /** Tests for {@link StructuredData}. */ @RunWith(MockitoJUnitRunner.class) @@ -796,6 +760,28 @@ public void testDateTime_unparsedCharacters() throws IOException { converter.convert("2018-08-08T15:48:17.000-07:00 and so on"); } + @Test + public void testIgnoreConversionErrors() throws IOException { + setupSchema(); + StructuredData.setIgnoreConversionErrors(true); + StructuredDataObject expected = + new StructuredDataObject() + .setProperties( + Arrays.asList( + new NamedProperty() + .setName("dateProperty") + .setDateValues(new DateValues().setValues( + Arrays.asList(new Date().setDay(1).setMonth(1).setYear(2019)))) + )); + + Multimap values = ArrayListMultimap.create(); + values.put("dateProperty", " - - "); + values.put("dateProperty", "2019-01-01"); + values.put("dateProperty", "bad-date"); + assertEquals(expected, StructuredData.getStructuredData("myObject", values)); + } + + private void setupSchema() { Schema schema = new Schema(); schema.setObjectDefinitions( From 2936777fa50eb3a4cd35324a4606afe26cb035cf Mon Sep 17 00:00:00 2001 From: Chad Johnson Date: Mon, 17 Jun 2019 09:52:36 -0600 Subject: [PATCH 5/6] Fixed imports and whitespace differences --- .../sdk/indexing/StructuredData.java | 64 +++++++++++++------ 1 file changed, 45 insertions(+), 19 deletions(-) diff --git a/indexing/src/main/java/com/google/enterprise/cloudsearch/sdk/indexing/StructuredData.java b/indexing/src/main/java/com/google/enterprise/cloudsearch/sdk/indexing/StructuredData.java index 35deaa3..d0e8889 100644 --- a/indexing/src/main/java/com/google/enterprise/cloudsearch/sdk/indexing/StructuredData.java +++ b/indexing/src/main/java/com/google/enterprise/cloudsearch/sdk/indexing/StructuredData.java @@ -15,10 +15,29 @@ */ package com.google.enterprise.cloudsearch.sdk.indexing; +import static com.google.common.base.Preconditions.checkArgument; +import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkState; +import static java.nio.charset.Charset.defaultCharset; + import com.google.api.client.json.JsonObjectParser; import com.google.api.client.json.jackson2.JacksonFactory; import com.google.api.client.util.DateTime; -import com.google.api.services.cloudsearch.v1.model.*; +import com.google.api.services.cloudsearch.v1.model.DateValues; +import com.google.api.services.cloudsearch.v1.model.DoubleValues; +import com.google.api.services.cloudsearch.v1.model.EnumPropertyOptions; +import com.google.api.services.cloudsearch.v1.model.EnumValuePair; +import com.google.api.services.cloudsearch.v1.model.EnumValues; +import com.google.api.services.cloudsearch.v1.model.HtmlValues; +import com.google.api.services.cloudsearch.v1.model.IntegerValues; +import com.google.api.services.cloudsearch.v1.model.NamedProperty; +import com.google.api.services.cloudsearch.v1.model.ObjectDefinition; +import com.google.api.services.cloudsearch.v1.model.ObjectValues; +import com.google.api.services.cloudsearch.v1.model.PropertyDefinition; +import com.google.api.services.cloudsearch.v1.model.Schema; +import com.google.api.services.cloudsearch.v1.model.StructuredDataObject; +import com.google.api.services.cloudsearch.v1.model.TextValues; +import com.google.api.services.cloudsearch.v1.model.TimestampValues; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Converter; import com.google.common.base.Strings; @@ -29,10 +48,6 @@ import com.google.enterprise.cloudsearch.sdk.InvalidConfigurationException; import com.google.enterprise.cloudsearch.sdk.StartupException; import com.google.enterprise.cloudsearch.sdk.config.Configuration; -import org.junit.rules.TestRule; -import org.junit.runner.Description; -import org.junit.runners.model.Statement; - import java.io.IOException; import java.io.InputStreamReader; import java.nio.file.Files; @@ -49,15 +64,26 @@ import java.time.format.ResolverStyle; import java.time.temporal.TemporalAccessor; import java.time.temporal.TemporalQueries; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collection; +import java.util.Collections; import java.util.Date; -import java.util.*; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.TimeZone; import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Level; import java.util.logging.Logger; import java.util.stream.Collectors; - -import static com.google.common.base.Preconditions.*; -import static java.nio.charset.Charset.defaultCharset; +import org.junit.rules.TestRule; +import org.junit.runner.Description; +import org.junit.runners.model.Statement; /** * Helper utility to generate a {@link StructuredDataObject}. @@ -341,14 +367,14 @@ private ValueExtractor( private NamedProperty getProperty(String propertyName, Collection values) { List nonNullValues = - values.stream().filter(Objects::nonNull).collect(Collectors.toList()); + values.stream().filter(Objects::nonNull).collect(Collectors.toList()); if (nonNullValues.isEmpty()) { return null; } if (!isRepeated) { try { return propertyBuilder.getNamedProperty( - propertyName, Collections.singletonList(valueConverter.convert(nonNullValues.get(0)))); + propertyName, Collections.singletonList(valueConverter.convert(nonNullValues.get(0)))); } catch (IllegalArgumentException e) { if (ignoreConversionErrors.get()) { logger.log(Level.FINEST, "Ignoring conversion error: {0}", e.getMessage()); @@ -358,16 +384,16 @@ private NamedProperty getProperty(String propertyName, Collection values } } else { List nonNullConvertedValues = nonNullValues - .stream() - .map(v -> convert(valueConverter, v)) - .filter(Objects::nonNull) - .collect(Collectors.toList()); - if(nonNullConvertedValues.isEmpty()) { + .stream() + .map(v -> convert(valueConverter, v)) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + if (nonNullConvertedValues.isEmpty()) { return null; } return propertyBuilder.getNamedProperty( - propertyName, - nonNullConvertedValues); + propertyName, + nonNullConvertedValues); } } @@ -375,7 +401,7 @@ private T convert(Converter converter, Object v) { try { return converter.convert(v); } catch (IllegalArgumentException e) { - if(ignoreConversionErrors.get()) { + if (ignoreConversionErrors.get()) { logger.log(Level.FINEST, "Ignoring conversion error: {0}", e.getMessage()); return null; } From 2959d90bf78044dc6434010c0846a40618dadc5b Mon Sep 17 00:00:00 2001 From: Chad Johnson Date: Mon, 17 Jun 2019 09:54:16 -0600 Subject: [PATCH 6/6] Fixed imports and whitespace differences --- .../sdk/indexing/StructuredDataTest.java | 74 ++++++++++++++----- 1 file changed, 55 insertions(+), 19 deletions(-) diff --git a/indexing/src/test/java/com/google/enterprise/cloudsearch/sdk/indexing/StructuredDataTest.java b/indexing/src/test/java/com/google/enterprise/cloudsearch/sdk/indexing/StructuredDataTest.java index 776029c..91de7a8 100644 --- a/indexing/src/test/java/com/google/enterprise/cloudsearch/sdk/indexing/StructuredDataTest.java +++ b/indexing/src/test/java/com/google/enterprise/cloudsearch/sdk/indexing/StructuredDataTest.java @@ -15,9 +15,45 @@ */ package com.google.enterprise.cloudsearch.sdk.indexing; +import static java.nio.charset.StandardCharsets.UTF_8; +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.instanceOf; +import static org.hamcrest.CoreMatchers.not; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; +import static org.mockito.Mockito.when; + import com.google.api.client.util.DateTime; +import com.google.api.services.cloudsearch.v1.model.BooleanPropertyOptions; import com.google.api.services.cloudsearch.v1.model.Date; -import com.google.api.services.cloudsearch.v1.model.*; +import com.google.api.services.cloudsearch.v1.model.DatePropertyOptions; +import com.google.api.services.cloudsearch.v1.model.DateValues; +import com.google.api.services.cloudsearch.v1.model.DoublePropertyOptions; +import com.google.api.services.cloudsearch.v1.model.DoubleValues; +import com.google.api.services.cloudsearch.v1.model.EnumPropertyOptions; +import com.google.api.services.cloudsearch.v1.model.EnumValuePair; +import com.google.api.services.cloudsearch.v1.model.EnumValues; +import com.google.api.services.cloudsearch.v1.model.GSuitePrincipal; +import com.google.api.services.cloudsearch.v1.model.HtmlPropertyOptions; +import com.google.api.services.cloudsearch.v1.model.HtmlValues; +import com.google.api.services.cloudsearch.v1.model.IntegerPropertyOptions; +import com.google.api.services.cloudsearch.v1.model.IntegerValues; +import com.google.api.services.cloudsearch.v1.model.NamedProperty; +import com.google.api.services.cloudsearch.v1.model.ObjectDefinition; +import com.google.api.services.cloudsearch.v1.model.ObjectPropertyOptions; +import com.google.api.services.cloudsearch.v1.model.ObjectValues; +import com.google.api.services.cloudsearch.v1.model.Principal; +import com.google.api.services.cloudsearch.v1.model.PropertyDefinition; +import com.google.api.services.cloudsearch.v1.model.Schema; +import com.google.api.services.cloudsearch.v1.model.StructuredDataObject; +import com.google.api.services.cloudsearch.v1.model.TextPropertyOptions; +import com.google.api.services.cloudsearch.v1.model.TextValues; +import com.google.api.services.cloudsearch.v1.model.TimestampPropertyOptions; +import com.google.api.services.cloudsearch.v1.model.TimestampValues; import com.google.common.base.Converter; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; @@ -27,6 +63,16 @@ import com.google.enterprise.cloudsearch.sdk.config.Configuration.ResetConfigRule; import com.google.enterprise.cloudsearch.sdk.config.Configuration.SetupConfigRule; import com.google.enterprise.cloudsearch.sdk.indexing.StructuredData.ResetStructuredDataRule; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Collections; +import java.util.List; +import java.util.Properties; +import java.util.TimeZone; +import java.util.stream.Collectors; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ErrorCollector; @@ -36,16 +82,6 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; -import java.io.File; -import java.io.IOException; -import java.util.*; -import java.util.stream.Collectors; - -import static java.nio.charset.StandardCharsets.UTF_8; -import static org.hamcrest.CoreMatchers.*; -import static org.junit.Assert.*; -import static org.mockito.Mockito.when; - /** Tests for {@link StructuredData}. */ @RunWith(MockitoJUnitRunner.class) @@ -765,14 +801,14 @@ public void testIgnoreConversionErrors() throws IOException { setupSchema(); StructuredData.setIgnoreConversionErrors(true); StructuredDataObject expected = - new StructuredDataObject() - .setProperties( - Arrays.asList( - new NamedProperty() - .setName("dateProperty") - .setDateValues(new DateValues().setValues( - Arrays.asList(new Date().setDay(1).setMonth(1).setYear(2019)))) - )); + new StructuredDataObject() + .setProperties( + Arrays.asList( + new NamedProperty() + .setName("dateProperty") + .setDateValues(new DateValues().setValues( + Arrays.asList(new Date().setDay(1).setMonth(1).setYear(2019)))) + )); Multimap values = ArrayListMultimap.create(); values.put("dateProperty", " - - ");