blob: a10f562ca7cf7cb95594dbfe07d396465f829e32 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.camel.component.facebook.data;
import java.lang.reflect.Field;
import java.util.LinkedHashMap;
import java.util.Locale;
import java.util.Map;
import facebook4j.Reading;
/**
* Builds {@link facebook4j.Reading} instances.
*/
public final class ReadingBuilder {
private ReadingBuilder() {
// Helper class
}
public static Reading copy(Reading reading, boolean skipSinceUtil) throws NoSuchFieldException, IllegalAccessException {
// use private field access to make a copy
Field field = Reading.class.getDeclaredField("parameterMap");
field.setAccessible(true);
final LinkedHashMap<String, String> source = (LinkedHashMap<String, String>) field.get(reading);
// create another reading, and add all fields from source
Reading copy = new Reading();
final LinkedHashMap<String, String> copyMap = new LinkedHashMap<String, String>();
copyMap.putAll(source);
if (skipSinceUtil) {
copyMap.remove("since");
copyMap.remove("until");
}
field.set(copy, copyMap);
field.setAccessible(false);
return copy;
}
/**
* Sets Reading properties.
* @param reading Reading object to populate
* @param readingProperties Map to extract properties
*/
public static void setProperties(Reading reading, Map<String, Object> readingProperties) {
final String fields = (String) readingProperties.remove("fields");
if (fields != null) {
reading.fields(fields.toString().split(","));
}
final Object limit = readingProperties.remove("limit");
if (limit != null) {
reading.limit(Integer.parseInt(limit.toString()));
}
final Object offset = readingProperties.remove("offset");
if (offset != null) {
reading.offset(Integer.parseInt(offset.toString()));
}
final Object until = readingProperties.remove("until");
if (until != null) {
// take the string form as is to support PHP strtotime, no validation until API call!
reading.until(until.toString());
}
final Object since = readingProperties.remove("since");
if (since != null) {
// take the string form as is to support PHP strtotime, no validation until API call!
reading.since(since.toString());
}
final Object metadata = readingProperties.remove("metadata");
if (metadata != null && Boolean.parseBoolean(metadata.toString())) {
reading.metadata();
}
final Object locale = readingProperties.remove("locale");
if (locale != null) {
String[] args = locale.toString().split(",");
switch (args.length) {
case 1:
reading.locale(new Locale(args[0]));
break;
case 2:
reading.locale(new Locale(args[0], args[1]));
break;
case 3:
reading.locale(new Locale(args[0], args[1], args[2]));
break;
default:
throw new IllegalArgumentException(String.format("Invalid value for property 'locale' %s, "
+ "must be of the form [language][,country][,variant]", locale.toString()));
}
}
final Object with = readingProperties.remove("with");
if (with != null && Boolean.parseBoolean(with.toString())) {
reading.withLocation();
}
final Object filter = readingProperties.remove("filter");
if (filter != null) {
reading.filter(filter.toString());
}
}
public static Reading merge(Reading reading, Reading readingUpdate) throws NoSuchFieldException, IllegalAccessException {
Reading mergedReading = new Reading();
Field field = Reading.class.getDeclaredField("parameterMap");
field.setAccessible(true);
final LinkedHashMap<String, Object> readingParameters = (LinkedHashMap<String, Object>) field.get(reading);
readingParameters.putAll((LinkedHashMap<String, Object>) field.get(readingUpdate));
field.setAccessible(false);
setProperties(mergedReading, readingParameters);
return mergedReading;
}
}