/** * Copyright (C) 2012-2017 the original author or authors. * * Licensed 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 ninja.params; import java.io.File; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Map; import ninja.Context; import ninja.session.FlashScope; import ninja.session.Session; import ninja.uploads.FileItem; import ninja.validation.Validation; import com.google.common.collect.ImmutableMap; import com.google.inject.Inject; /** * Built in argument extractors * * @author James Roper */ public class ArgumentExtractors { private static final Map<Class<?>, ArgumentExtractor<?>> STATIC_EXTRACTORS = ImmutableMap.<Class<?>, ArgumentExtractor<?>>builder() .put(Context.class, new ContextExtractor()) .put(Validation.class, new ValidationExtractor()) .put(Session.class, new SessionExtractor()) .put(FlashScope.class, new FlashExtractor()) .build(); public static ArgumentExtractor<?> getExtractorForType(Class<?> type) { return STATIC_EXTRACTORS.get(type); } public static class ContextExtractor implements ArgumentExtractor<Context> { @Override public Context extract(Context context) { return context; } @Override public Class<Context> getExtractedType() { return Context.class; } @Override public String getFieldName() { return null; } } public static class ValidationExtractor implements ArgumentExtractor<Validation> { @Override public Validation extract(Context context) { return context.getValidation(); } @Override public Class<Validation> getExtractedType() { return Validation.class; } @Override public String getFieldName() { return null; } } public static class SessionExtractor implements ArgumentExtractor<Session> { @Override public Session extract(Context context) { return context.getSession(); } @Override public Class<Session> getExtractedType() { return Session.class; } @Override public String getFieldName() { return null; } } public static class FlashExtractor implements ArgumentExtractor<FlashScope> { @Override public FlashScope extract(Context context) { return context.getFlashScope(); } @Override public Class<FlashScope> getExtractedType() { return FlashScope.class; } @Override public String getFieldName() { return null; } } public static class PathParamExtractor implements ArgumentExtractor<String> { private final String key; public PathParamExtractor(PathParam pathParam) { this.key = pathParam.value(); } @Override public String extract(Context context) { return context.getPathParameter(key); } @Override public Class<String> getExtractedType() { return String.class; } @Override public String getFieldName() { return key; } } public static class ParamExtractor implements ArgumentExtractor<String> { private final String key; public ParamExtractor(Param param) { this.key = param.value(); } @Override public String extract(Context context) { return context.getParameter(key); } @Override public Class<String> getExtractedType() { return String.class; } @Override public String getFieldName() { return key; } } public static class ParamsExtractor implements ArgumentExtractor<String[]> { private final String key; public ParamsExtractor(Params param) { this.key = param.value(); } @Override public String[] extract(Context context) { List<String> values = context.getParameterValues(key); if (values == null || values.isEmpty()) { return null; } return values.toArray(new String[values.size()]); } @Override public Class<String[]> getExtractedType() { return String[].class; } @Override public String getFieldName() { return key; } } public static class FileItemParamExtractor implements ArgumentExtractor<FileItem> { private final String key; public FileItemParamExtractor(Param param) { this.key = param.value(); } @Override public FileItem extract(Context context) { return context.getParameterAsFileItem(key); } @Override public Class<FileItem> getExtractedType() { return FileItem.class; } @Override public String getFieldName() { return key; } } public static class FileItemParamsExtractor implements ArgumentExtractor<FileItem[]> { private final String key; public FileItemParamsExtractor(Params param) { this.key = param.value(); } @Override public FileItem[] extract(Context context) { List<FileItem> values = new ArrayList<FileItem>(); for (FileItem fileItem : context.getParameterAsFileItems(key)) { values.add(fileItem); } return values.toArray(new FileItem[values.size()]); } @Override public Class<FileItem[]> getExtractedType() { return FileItem[].class; } @Override public String getFieldName() { return key; } } public static class FileParamExtractor implements ArgumentExtractor<File> { private final String key; public FileParamExtractor(Param param) { this.key = param.value(); } @Override public File extract(Context context) { return context.getParameterAsFileItem(key).getFile(); } @Override public Class<File> getExtractedType() { return File.class; } @Override public String getFieldName() { return key; } } public static class FileParamsExtractor implements ArgumentExtractor<File[]> { private final String key; public FileParamsExtractor(Params param) { this.key = param.value(); } @Override public File[] extract(Context context) { List<File> values = new ArrayList<File>(); for (FileItem fileItem : context.getParameterAsFileItems(key)) { values.add(fileItem.getFile()); } return values.toArray(new File[values.size()]); } @Override public Class<File[]> getExtractedType() { return File[].class; } @Override public String getFieldName() { return key; } } public static class InputStreamParamExtractor implements ArgumentExtractor<InputStream> { private final String key; public InputStreamParamExtractor(Param param) { this.key = param.value(); } @Override public InputStream extract(Context context) { return context.getParameterAsFileItem(key).getInputStream(); } @Override public Class<InputStream> getExtractedType() { return InputStream.class; } @Override public String getFieldName() { return key; } } public static class InputStreamParamsExtractor implements ArgumentExtractor<InputStream[]> { private final String key; public InputStreamParamsExtractor(Params param) { this.key = param.value(); } @Override public InputStream[] extract(Context context) { List<InputStream> values = new ArrayList<InputStream>(); for (FileItem fileItem : context.getParameterAsFileItems(key)) { values.add(fileItem.getInputStream()); } return values.toArray(new InputStream[values.size()]); } @Override public Class<InputStream[]> getExtractedType() { return InputStream[].class; } @Override public String getFieldName() { return key; } } public static class HeaderExtractor implements ArgumentExtractor<String> { private final String key; public HeaderExtractor(Header header) { this.key = header.value(); } @Override public String extract(Context context) { return context.getHeader(key); } @Override public Class<String> getExtractedType() { return String.class; } @Override public String getFieldName() { return key; } } public static class HeadersExtractor implements ArgumentExtractor<String[]> { private final String key; public HeadersExtractor(Headers headers) { this.key = headers.value(); } @Override public String[] extract(Context context) { List<String> values = context.getHeaders(key); if (values == null || values.isEmpty()) { return null; } return values.toArray(new String[values.size()]); } @Override public Class<String[]> getExtractedType() { return String[].class; } @Override public String getFieldName() { return key; } } public static class SessionParamExtractor implements ArgumentExtractor<String> { private final String key; public SessionParamExtractor(SessionParam sessionParam) { this.key = sessionParam.value(); } @Override public String extract(Context context) { return context.getSession().get(key); } @Override public Class<String> getExtractedType() { return String.class; } @Override public String getFieldName() { return key; } } public static class AttributeExtractor implements ArgumentExtractor<Object> { private final String key; private final Class<?> attributeType; @Inject public AttributeExtractor(Attribute attribute, ArgumentClassHolder attributeType) { this.key = attribute.value(); this.attributeType = attributeType.getArgumentClass(); } @Override public Object extract(Context context) { return context.getAttribute(key, attributeType); } @Override @SuppressWarnings({ "rawtypes", "unchecked" }) public Class getExtractedType() { return attributeType; } @Override public String getFieldName() { return key; } } public static class BodyAsExtractor<T> implements ArgumentExtractor<T> { private final Class<T> bodyType; public BodyAsExtractor(Class<T> bodyType) { this.bodyType = bodyType; } @Override public T extract(Context context) { return context.parseBody(bodyType); } @Override public Class<T> getExtractedType() { return bodyType; } @Override public String getFieldName() { return null; } } }