/**
* JBoss, Home of Professional Open Source
* Copyright Red Hat, Inc., and individual contributors.
*
* 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 org.jboss.aerogear.unifiedpush.rest.registry.applications;
import com.qmino.miredot.annotations.BodyType;
import com.qmino.miredot.annotations.ReturnType;
import org.jboss.aerogear.unifiedpush.api.AdmVariant;
import org.jboss.aerogear.unifiedpush.api.AndroidVariant;
import org.jboss.aerogear.unifiedpush.api.PushApplication;
import org.jboss.aerogear.unifiedpush.api.SimplePushVariant;
import org.jboss.aerogear.unifiedpush.api.WindowsMPNSVariant;
import org.jboss.aerogear.unifiedpush.api.WindowsVariant;
import org.jboss.aerogear.unifiedpush.api.WindowsWNSVariant;
import org.jboss.aerogear.unifiedpush.api.iOSVariant;
import org.jboss.aerogear.unifiedpush.rest.AbstractBaseEndpoint;
import org.jboss.aerogear.unifiedpush.rest.util.BootstrapForm;
import org.jboss.aerogear.unifiedpush.service.GenericVariantService;
import org.jboss.aerogear.unifiedpush.service.PushApplicationService;
import org.jboss.resteasy.annotations.providers.multipart.MultipartForm;
import javax.inject.Inject;
import javax.validation.ConstraintViolationException;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriBuilder;
@Path("/applications/bootstrap")
public class BootstrapEndpoint extends AbstractBaseEndpoint {
@Inject
private PushApplicationService pushAppService;
@Inject
protected GenericVariantService variantService;
/**
* Convenience endpoint to create a complete Push Application with a set of variants
*
* @param form Form containing data for Push App and variants
* @return created {@link PushApplication}
*
* @statuscode 201 The PushApplication with Variants are created successfully
* @statuscode 400 The format of the client request was incorrect
*/
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON)
@BodyType("org.jboss.aerogear.unifiedpush.rest.util.BootstrapForm")
@ReturnType("org.jboss.aerogear.unifiedpush.api.PushApplication")
public Response registerPushApplicationAndVariants(@MultipartForm BootstrapForm form) {
// some basic validation
try {
validateModelClass(form);
} catch (ConstraintViolationException cve) {
// Build and return the 400 (Bad Request) response
Response.ResponseBuilder builder = createBadRequestResponse(cve.getConstraintViolations());
return builder.build();
}
// root push application
final PushApplication pushApplication = new PushApplication();
pushApplication.setName(form.getPushApplicationName());
pushAppService.addPushApplication(pushApplication);
// nested variants
AndroidVariant androidVariant;
iOSVariant iOSVariant;
WindowsVariant windowsVariant = null;
SimplePushVariant simplePushVariant;
AdmVariant admVariant;
// Android around ?
if (form.getAndroidVariantName() != null) {
androidVariant = new AndroidVariant();
androidVariant.setName(form.getAndroidVariantName());
androidVariant.setGoogleKey(form.getAndroidGoogleKey());
androidVariant.setProjectNumber(form.getAndroidProjectNumber());
// store the model, add variant references and merge:
variantService.addVariant(androidVariant);
pushAppService.addVariant(pushApplication, androidVariant);
}
// iOS around ?
if (form.getiOSVariantName() != null) {
iOSVariant = new iOSVariant();
iOSVariant.setName(form.getiOSVariantName());
iOSVariant.setPassphrase(form.getiOSPassphrase());
iOSVariant.setCertificate(form.getiOSCertificate());
iOSVariant.setProduction(form.getiOSProduction());
// store the model, add variant references and merge:
variantService.addVariant(iOSVariant);
pushAppService.addVariant(pushApplication, iOSVariant);
}
// Windows around?
if (form.getWindowsVariantName() != null) {
final String windowsType = form.getWindowsType().toLowerCase();
switch (windowsType) {
case "mpns":
WindowsMPNSVariant mpnsVariant = new WindowsMPNSVariant();
mpnsVariant.setName(form.getWindowsVariantName());
// store ref:
windowsVariant = mpnsVariant;
break;
case "wns":
WindowsWNSVariant wnsVariant = new WindowsWNSVariant();
wnsVariant.setName(form.getWindowsVariantName());
wnsVariant.setSid(form.getWindowsSid());
wnsVariant.setClientSecret(form.getWindowsClientSecret());
// store ref:
windowsVariant = wnsVariant;
break;
}
// store the model, add variant references and merge:
variantService.addVariant(windowsVariant);
pushAppService.addVariant(pushApplication, windowsVariant);
}
// SimplePush around ?
if (form.getSimplePushVariantName() != null) {
simplePushVariant = new SimplePushVariant();
simplePushVariant.setName(form.getSimplePushVariantName());
// store the model, add variant references and merge:
variantService.addVariant(simplePushVariant);
pushAppService.addVariant(pushApplication, simplePushVariant);
}
// Android around ?
if (form.getAdmVariantName() != null) {
admVariant = new AdmVariant();
admVariant.setName(form.getAdmVariantName());
admVariant.setClientId(form.getAdmClientId());
admVariant.setClientSecret(form.getAdmClientSecret());
// store the model, add variant references and merge:
variantService.addVariant(admVariant);
pushAppService.addVariant(pushApplication, admVariant);
}
return Response.created(
UriBuilder.fromResource(PushApplicationEndpoint.class)
.path(String.valueOf(pushApplication.getPushApplicationID()))
.build())
.entity(pushApplication)
.build();
}
}