/**
* Copyright 2015 ArcBees Inc.
*
* 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.arcbees.gaestudio.companion.rest;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Set;
import javax.inject.Inject;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import com.arcbees.gaestudio.companion.dao.BusinessDao;
import com.arcbees.gaestudio.companion.dao.CarDao;
import com.arcbees.gaestudio.companion.dao.ConceptDao;
import com.arcbees.gaestudio.companion.dao.ManufacturerDao;
import com.arcbees.gaestudio.companion.dao.VehicleDao;
import com.arcbees.gaestudio.companion.domain.Business;
import com.arcbees.gaestudio.companion.domain.Car;
import com.arcbees.gaestudio.companion.domain.Concept;
import com.arcbees.gaestudio.companion.domain.Manufacturer;
import com.arcbees.gaestudio.companion.domain.Vehicle;
import com.google.appengine.api.datastore.GeoPt;
import com.googlecode.objectify.Key;
import com.googlecode.objectify.Ref;
@Path(TestEndPoints.CAR)
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class CarResource {
private final CarDao carDao;
private final VehicleDao vehicleDao;
private final ManufacturerDao manufacturerDao;
private final BusinessDao businessDao;
private final ConceptDao conceptDao;
@Inject
CarResource(CarDao carDao,
VehicleDao vehicleDao,
ManufacturerDao manufacturerDao,
BusinessDao businessDao,
ConceptDao conceptDao) {
this.carDao = carDao;
this.vehicleDao = vehicleDao;
this.manufacturerDao = manufacturerDao;
this.businessDao = businessDao;
this.conceptDao = conceptDao;
}
@POST
public Response createCar(Car car) {
car.setId(null);
if (car.getMixedProperties() != null) {
convertGeoPts(car);
}
carDao.put(car);
return Response.ok(car.getId()).build();
}
@Path(TestEndPoints.HIERARCHY)
@POST
public Response createCarWithHierarchy(Car car) {
car.setId(null);
if (car.getMixedProperties() != null) {
convertGeoPts(car);
}
setVehicleParent(car);
setManufacturerRef(car);
carDao.put(car);
return Response.ok(car.getId()).build();
}
@GET
public Response getCar(@QueryParam(TestEndPoints.PARAM_ID) Long id) {
Car car = carDao.get(id);
return car != null ? Response.ok(car).build() : Response.status(Response.Status.NOT_FOUND).build();
}
@DELETE
public Response deleteCar(Long id) {
carDao.delete(id);
return Response.noContent().build();
}
private void convertGeoPts(Car car) {
List<Object> mixedProperties = car.getMixedProperties();
for (int i = 0; i < mixedProperties.size(); i++) {
Object obj = mixedProperties.get(i);
if (isGeoPt(obj)) {
LinkedHashMap<String, Double> map = (LinkedHashMap<String, Double>) obj;
double latitutde = map.get("latitude");
double longitude = map.get("longitude");
mixedProperties.set(i, new GeoPt(new Float(latitutde), new Float(longitude)));
}
}
}
private boolean isGeoPt(Object obj) throws ClassCastException {
boolean isGeoPt = false;
try {
LinkedHashMap<String, Double> map = (LinkedHashMap<String, Double>) obj;
Set<String> keys = map.keySet();
if (keys.contains("latitude") && keys.contains("longitude")) {
isGeoPt = true;
}
} catch (ClassCastException e) {
isGeoPt = false;
}
return isGeoPt;
}
private void setVehicleParent(Car car) {
Vehicle vehicle = new Vehicle();
vehicleDao.put(vehicle);
car.setVehicleKey(Key.create(Vehicle.class, vehicle.getId()));
}
private void setManufacturerRef(Car car) {
Concept concept = new Concept();
conceptDao.put(concept);
Business business = new Business();
Key<Concept> conceptKey = Key.create(Concept.class, concept.getId());
business.setConceptKey(conceptKey);
businessDao.put(business);
Manufacturer manufacturer = new Manufacturer();
Key<Business> businessKey = Key.create(conceptKey, Business.class, business.getId());
manufacturer.setBusinessKey(businessKey);
manufacturerDao.put(manufacturer);
car.setManufacturerRef(Ref.create(Key.create(businessKey, Manufacturer.class, manufacturer.getId())));
}
}