/* * 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.isis.viewer.restfulobjects.applib.util; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.List; import javax.ws.rs.core.CacheControl; import javax.ws.rs.core.MediaType; import org.apache.isis.viewer.restfulobjects.applib.JsonRepresentation; import com.google.common.base.Function; import com.google.common.base.Joiner; import com.google.common.base.Splitter; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; public abstract class Parser<T> { public T valueOf(final List<String> str) { if (str == null) { return null; } if (str.size() == 0) { return null; } return valueOf(str.get(0)); } public T valueOf(final String[] str) { if (str == null) { return null; } if (str.length == 0) { return null; } return valueOf(str[0]); } public T valueOf(final JsonRepresentation jsonRepresentation) { if (jsonRepresentation == null) { return null; } return valueOf(jsonRepresentation.asString()); } public JsonRepresentation asJsonRepresentation(final T t) { return JsonRepresentation.newMap("dummy", asString(t)).getRepresentation("dummy"); } public abstract T valueOf(String str); public abstract String asString(T t); public final static Parser<String> forString() { return new Parser<String>() { @Override public String valueOf(final String str) { return str; } @Override public String asString(final String t) { return t; } }; } public static Parser<Date> forDate() { return new Parser<Date>() { private final SimpleDateFormat RFC1123_DATE_FORMAT = new SimpleDateFormat("EEE, dd MMM yyyyy HH:mm:ss z"); @Override public Date valueOf(final String str) { if (str == null) { return null; } try { return RFC1123_DATE_FORMAT.parse(str); } catch (final ParseException e) { return null; } } @Override public String asString(final Date t) { return RFC1123_DATE_FORMAT.format(t); } }; } public static Parser<CacheControl> forCacheControl() { return new Parser<CacheControl>() { @Override public CacheControl valueOf(final String str) { if (str == null) { return null; } final CacheControl cacheControl = CacheControl.valueOf(str); // workaround for bug in CacheControl's equals() method cacheControl.getCacheExtension(); cacheControl.getNoCacheFields(); return cacheControl; } @Override public String asString(final CacheControl cacheControl) { return cacheControl.toString(); } }; } public static Parser<MediaType> forJaxRsMediaType() { return new Parser<MediaType>() { @Override public MediaType valueOf(final String str) { if (str == null) { return null; } return MediaType.valueOf(str); } @Override public String asString(final MediaType t) { return t.toString(); } }; } public static Parser<com.google.common.net.MediaType> forGuavaMediaType() { return new Parser<com.google.common.net.MediaType>() { @Override public com.google.common.net.MediaType valueOf(final String str) { if (str == null) { return null; } return com.google.common.net.MediaType.parse(str); } @Override public String asString(final com.google.common.net.MediaType t) { return t.toString(); } }; } public static Parser<Boolean> forBoolean() { return new Parser<Boolean>() { @Override public Boolean valueOf(final String str) { if (str == null) { return null; } return str.equals("yes") ? Boolean.TRUE : Boolean.FALSE; } @Override public String asString(final Boolean t) { return t ? "yes" : "no"; } }; } public static Parser<Integer> forInteger() { return new Parser<Integer>() { @Override public Integer valueOf(final String str) { if (str == null) { return null; } return Integer.valueOf(str); } @Override public String asString(final Integer t) { return t.toString(); } }; } public static Parser<List<String>> forListOfStrings() { return new Parser<List<String>>() { @Override public List<String> valueOf(final List<String> strings) { if (strings == null) { return Collections.emptyList(); } if (strings.size() == 1) { // special case processing to handle comma-separated values return valueOf(strings.get(0)); } return strings; } @Override public List<String> valueOf(final String[] strings) { if (strings == null) { return Collections.emptyList(); } if (strings.length == 1) { // special case processing to handle comma-separated values return valueOf(strings[0]); } return Arrays.asList(strings); } @Override public List<String> valueOf(final String str) { if (str == null) { return Collections.emptyList(); } return Lists.newArrayList(Splitter.on(",").split(str)); } @Override public String asString(final List<String> strings) { return Joiner.on(",").join(strings); } }; } public static Parser<List<List<String>>> forListOfListOfStrings() { return new Parser<List<List<String>>>() { @Override public List<List<String>> valueOf(final List<String> str) { if (str == null) { return null; } if (str.size() == 0) { return null; } final List<List<String>> listOfLists = Lists.newArrayList(); for (final String s : str) { listOfLists.add(PathNode.split(s)); } return listOfLists; } @Override public List<List<String>> valueOf(final String[] str) { if (str == null) { return null; } if (str.length == 0) { return null; } return valueOf(Arrays.asList(str)); } @Override public List<List<String>> valueOf(final String str) { if (str == null || str.isEmpty()) { return Collections.emptyList(); } final Iterable<String> listOfStrings = Splitter.on(',').split(str); return Lists.transform(Lists.newArrayList(listOfStrings), new Function<String, List<String>>() { @Override public List<String> apply(final String input) { return PathNode.split(input); } }); } @Override public String asString(final List<List<String>> listOfLists) { final List<String> listOfStrings = Lists.transform(listOfLists, new Function<List<String>, String>() { @Override public String apply(final List<String> listOfStrings) { return Joiner.on('.').join(listOfStrings); } }); return Joiner.on(',').join(listOfStrings); } }; } public static Parser<String[]> forArrayOfStrings() { return new Parser<String[]>() { @Override public String[] valueOf(final List<String> strings) { if (strings == null) { return new String[] {}; } if (strings.size() == 1) { // special case processing to handle comma-separated values return valueOf(strings.get(0)); } return strings.toArray(new String[] {}); } @Override public String[] valueOf(final String[] strings) { if (strings == null) { return new String[] {}; } if (strings.length == 1) { // special case processing to handle comma-separated values return valueOf(strings[0]); } return strings; } @Override public String[] valueOf(final String str) { if (str == null) { return new String[] {}; } final Iterable<String> split = Splitter.on(",").split(str); return Iterables.toArray(split, String.class); } @Override public String asString(final String[] strings) { return Joiner.on(",").join(strings); } }; } public static Parser<List<MediaType>> forListOfJaxRsMediaTypes() { return new Parser<List<MediaType>>() { @Override public List<MediaType> valueOf(final String str) { if (str == null) { return Collections.emptyList(); } final List<String> strings = Lists.newArrayList(Splitter.on(",").split(str)); return Lists.transform(strings, new Function<String, MediaType>() { @Override public MediaType apply(final String input) { return MediaType.valueOf(input); } }); } @Override public String asString(final List<MediaType> listOfMediaTypes) { final List<String> strings = Lists.transform(listOfMediaTypes, new Function<MediaType, String>() { @Override public String apply(final MediaType input) { return input.toString(); } }); return Joiner.on(",").join(strings); } }; } public static Parser<List<com.google.common.net.MediaType>> forListOfGuavaMediaTypes() { return new Parser<List<com.google.common.net.MediaType>>() { @Override public List<com.google.common.net.MediaType> valueOf(final String str) { if (str == null) { return Collections.emptyList(); } final List<String> strings = Lists.newArrayList(Splitter.on(",").split(str)); return Lists.transform(strings, new Function<String, com.google.common.net.MediaType>() { @Override public com.google.common.net.MediaType apply(final String input) { return com.google.common.net.MediaType.parse(input); } }); } @Override public String asString(final List<com.google.common.net.MediaType> listOfMediaTypes) { final List<String> strings = Lists.transform(listOfMediaTypes, new Function<com.google.common.net.MediaType, String>() { @Override public String apply(final com.google.common.net.MediaType input) { return input.toString(); } }); return Joiner.on(",").join(strings); } }; } public static Parser<String> forETag() { return new Parser<String>(){ private final static String WEAK_PREFIX="W/"; @Override public String valueOf(String str) { if(str == null) { return null; } return null; } @Override public String asString(String t) { // TODO Auto-generated method stub return null; }}; } }