/* Copyright (c) 2015 LinkedIn Corp. 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 com.linkedin.restli.examples.greetings.server; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import com.linkedin.restli.common.HttpStatus; import com.linkedin.restli.common.PatchRequest; import com.linkedin.restli.common.validation.CreateOnly; import com.linkedin.restli.common.validation.ReadOnly; import com.linkedin.restli.examples.greetings.api.Greeting; import com.linkedin.restli.examples.greetings.api.GreetingMap; import com.linkedin.restli.examples.greetings.api.MyItemArray; import com.linkedin.restli.examples.greetings.api.ValidationDemo; import com.linkedin.restli.examples.greetings.api.myEnum; import com.linkedin.restli.examples.greetings.api.myItem; import com.linkedin.restli.examples.greetings.api.myRecord; import com.linkedin.restli.server.BatchCreateKVResult; import com.linkedin.restli.server.BatchCreateRequest; import com.linkedin.restli.server.BatchPatchRequest; import com.linkedin.restli.server.BatchResult; import com.linkedin.restli.server.BatchUpdateRequest; import com.linkedin.restli.server.BatchUpdateResult; import com.linkedin.restli.server.CreateKVResponse; import com.linkedin.restli.server.RestLiServiceException; import com.linkedin.restli.server.UpdateResponse; import com.linkedin.restli.server.annotations.Finder; import com.linkedin.restli.server.annotations.QueryParam; import com.linkedin.restli.server.annotations.RestLiCollection; import com.linkedin.restli.server.annotations.RestMethod; import com.linkedin.restli.server.annotations.ReturnEntity; import com.linkedin.restli.server.resources.KeyValueResource; /** * A simplied resource for testing Rest.li data automatic validation with automatic projection. * * @author jnchen */ @RestLiCollection(name = "autoValidationWithProjection", namespace = "com.linkedin.restli.examples.greetings.client") @ReadOnly({"stringA", "intA", "UnionFieldWithInlineRecord/com.linkedin.restli.examples.greetings.api.myRecord/foo1", "ArrayWithInlineRecord/*/bar1", "validationDemoNext/stringB", "validationDemoNext/UnionFieldWithInlineRecord"}) @CreateOnly({"stringB", "intB", "UnionFieldWithInlineRecord/com.linkedin.restli.examples.greetings.api.myRecord/foo2", "MapWithTyperefs/*/id"}) public class AutomaticValidationWithProjectionResource implements KeyValueResource<Integer, ValidationDemo> { // A return entity that contains mix of valid and invalid fields in all levels for projection testing. private static ValidationDemo _returnEntity; // A return entity list that contains one _returnEntity private static List<ValidationDemo> _returnEntityList; static { _returnEntity = new ValidationDemo(); // mix of valid/invalid primitive fields _returnEntity.setStringB("valid"); _returnEntity.setIntB(8); // invalid but optional _returnEntity.setIncludedA("invalid, length is larger than the max"); //invalid include // _returnEntity.setStringA() invalid, missing require // _returnEntity.setIntA() valid, missing optional // partially valid field -- union ValidationDemo.UnionFieldWithInlineRecord union = new ValidationDemo.UnionFieldWithInlineRecord(); myRecord record = new myRecord(); // record.setFoo1(); invalid, missing require // record.setFoo2(); valid, missing optional union.setMyRecord(record); _returnEntity.setUnionFieldWithInlineRecord(union); // partially valid field -- array MyItemArray array = new MyItemArray(); myItem item = new myItem(); item.setBar1("bar1"); // valid // item.setBar2(); invalid, missing require array.add(item); _returnEntity.setArrayWithInlineRecord(array); // partially valid field -- typeref GreetingMap map = new GreetingMap(); Greeting greeting = new Greeting(); greeting.setId(1); // greeting.setMessage() invalid, missing require // greeting.setTone() invalid, missing require map.put("foo", greeting); _returnEntity.setMapWithTyperefs(map); // partially valid field -- record ValidationDemo nextDemo = new ValidationDemo(); nextDemo.setStringA("invalid, length is larger than the max"); nextDemo.setIntB(7); // valid nextDemo.setUnionFieldWithInlineRecord(union); nextDemo.setArrayWithInlineRecord(array); nextDemo.setMapWithTyperefs(map); // nextDemo.setStringB() invalid, missing require // _returnEntity.setIntA() valid, missing optional _returnEntity.setValidationDemoNext(nextDemo); _returnEntityList = new ArrayList<ValidationDemo>(); _returnEntityList.add(_returnEntity); } @RestMethod.Create @ReturnEntity public CreateKVResponse<Integer, ValidationDemo> create() throws CloneNotSupportedException { return new CreateKVResponse<Integer, ValidationDemo>(1, _returnEntity); } @RestMethod.BatchCreate @ReturnEntity public BatchCreateKVResult<Integer, ValidationDemo> batchCreate() { List<CreateKVResponse<Integer, ValidationDemo>> results = new ArrayList<CreateKVResponse<Integer, ValidationDemo>>(); results.add(new CreateKVResponse<Integer, ValidationDemo>(1, _returnEntity)); return new BatchCreateKVResult<Integer, ValidationDemo>(results); } @RestMethod.Get public ValidationDemo get() { return _returnEntity; } @RestMethod.BatchGet public BatchResult<Integer, ValidationDemo> batchGet() { Map<Integer, ValidationDemo> resultMap = new HashMap<Integer, ValidationDemo>(); resultMap.put(1, _returnEntity); return new BatchResult<Integer, ValidationDemo>(resultMap, new HashMap<Integer, RestLiServiceException>()); } @RestMethod.GetAll public List<ValidationDemo> getAll() { return _returnEntityList; } @Finder("searchWithProjection") public List<ValidationDemo> searchWithProjection() { List<ValidationDemo> validationDemos = new ArrayList<ValidationDemo>(); validationDemos.add(_returnEntity); return validationDemos; } }