/* * JBoss, Home of Professional Open Source * Copyright 2012, Red Hat Middleware LLC, and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of 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.arquillian.warp.impl.client.execution; import java.util.Collection; import java.util.Collections; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.jboss.arquillian.test.spi.TestResult; import org.jboss.arquillian.warp.Inspection; import org.jboss.arquillian.warp.RequestObserver; import org.jboss.arquillian.warp.client.execution.GroupExecutionSpecifier; import org.jboss.arquillian.warp.client.execution.GroupInspectionBuilder; import org.jboss.arquillian.warp.client.filter.Request; import org.jboss.arquillian.warp.client.filter.RequestFilter; import org.jboss.arquillian.warp.client.observer.ObserverBuilder; import org.jboss.arquillian.warp.impl.shared.RequestPayload; import org.jboss.arquillian.warp.impl.shared.ResponsePayload; /** * Default implemetnation of {@link WarpGroup}. * * @author Lukas Fryc */ public class WarpGroupImpl implements WarpGroup { private Object id; private RequestObserver observer; private GroupInspectionBuilder groupsExecutor; private int expectCount = 1; private Inspection[] inspections; private Map<Long, Request> requests = Collections.synchronizedMap(new LinkedHashMap<Long, Request>()); private Map<Long, ResponsePayload> payloads = Collections.synchronizedMap(new LinkedHashMap<Long, ResponsePayload>()); public WarpGroupImpl(GroupInspectionBuilder groupsExecutor, Object identifier) { this.groupsExecutor = groupsExecutor; this.id = identifier; } /* * (non-Javadoc) * @see org.jboss.arquillian.warp.client.execution.FilterSpecifier#filter(org.jboss.arquillian.warp.client.filter.RequestFilter) */ @Override public GroupExecutionSpecifier observe(RequestObserver what) { this.observer = what; return this; } /* * (non-Javadoc) * @see org.jboss.arquillian.warp.client.execution.FilterSpecifier#filter(java.lang.Class) */ @Override public GroupExecutionSpecifier observe(Class<? extends RequestObserver> observer) { this.observer = SecurityActions.newInstance(observer.getName(), new Class<?>[] {}, new Object[] {}, RequestFilter.class); return this; } @Override public GroupExecutionSpecifier observe(ObserverBuilder<?, ?> observerBuilder) { this.observer = observerBuilder.build(); return this; } /* * (non-Javadoc) * @see org.jboss.arquillian.warp.client.execution.GroupVerificationSpecifier#expectCount(int) */ @Override public GroupExecutionSpecifier expectCount(int numberOfRequests) { this.expectCount = numberOfRequests; return this; } /* * (non-Javadoc) * @see org.jboss.arquillian.warp.client.execution.GroupInspectionSpecifier#verify(org.jboss.arquillian.warp.ServerInspection[]) */ @Override public GroupInspectionBuilder inspect(Inspection... inspections) { addInspections(inspections); return groupsExecutor; } /* * (non-Javadoc) * @see org.jboss.arquillian.warp.impl.client.execution.WarpGroup#addInspections(org.jboss.arquillian.warp.ServerInspection[]) */ @Override public void addInspections(Inspection... inspections) { this.inspections = inspections; } /* * (non-Javadoc) * @see org.jboss.arquillian.warp.impl.client.execution.WarpGroup#getFilter() */ @Override public RequestObserver getObserver() { return observer; } /* * (non-Javadoc) * @see org.jboss.arquillian.warp.client.result.WarpGroupResult#getInspection() */ @Override public <T extends Inspection> T getInspection() { return (T) payloads.values().iterator().next().getInspections().get(0); } /* * (non-Javadoc) * @see org.jboss.arquillian.warp.client.result.WarpGroupResult#getInspectionForHitNumber(int) */ @Override public <T extends Inspection> T getInspectionForHitNumber(int hitNumber) { return (T) getInspectionsForHitNumber(hitNumber).get(0); } /* * (non-Javadoc) * @see org.jboss.arquillian.warp.client.result.WarpGroupResult#getInspections() */ @Override public List<Inspection> getInspections() { return payloads.values().iterator().next().getInspections(); } /* * (non-Javadoc) * @see org.jboss.arquillian.warp.client.result.WarpGroupResult#getInspectionsForHitNumber(int) */ @Override public List<Inspection> getInspectionsForHitNumber(int hitNumber) { ResponsePayload payload = (ResponsePayload) payloads.values().toArray()[hitNumber]; return payload.getInspections(); } /* * (non-Javadoc) * @see org.jboss.arquillian.warp.client.result.WarpGroupResult#getHitCount() */ @Override public int getHitCount() { return payloads.size(); } /* * (non-Javadoc) * @see org.jboss.arquillian.warp.impl.client.execution.WarpGroup#getId() */ public Object getId() { return id; } /* * (non-Javadoc) * @see org.jboss.arquillian.warp.impl.client.execution.WarpGroup#generateRequestPayload() */ public RequestPayload generateRequestPayload(Request request) { if (payloads.size() + 1 > expectCount) { throw new TooManyRequestsException(this, request); } RequestPayload requestPayload = new RequestPayload(inspections); requests.put(requestPayload.getSerialId(), request); payloads.put(requestPayload.getSerialId(), null); return requestPayload; } /* * (non-Javadoc) * @see org.jboss.arquillian.warp.impl.client.execution.WarpGroup#pushResponsePayload(org.jboss.arquillian.warp.impl.shared.ResponsePayload) */ public boolean pushResponsePayload(ResponsePayload responsePayload) { if (payloads.containsKey(responsePayload.getSerialId())) { payloads.put(responsePayload.getSerialId(), responsePayload); return true; } return false; } /* * (non-Javadoc) * @see org.jboss.arquillian.warp.impl.client.execution.WarpGroup#getFirstNonSuccessfulResult() */ public TestResult getFirstNonSuccessfulResult() { for (ResponsePayload payload : payloads.values()) { if (payload != null) { TestResult testResult = payload.getTestResult(); if (testResult != null) { switch (testResult.getStatus()) { case FAILED: return testResult; case SKIPPED: return testResult; case PASSED: } } } } return null; } @Override public String toString() { return "WarpGroupImpl [id=" + id + "]"; } @Override public int getExpectedRequestCount() { return expectCount; } @Override public Collection<Request> getRequestsWithoutResponse() { List<Request> requestsWithoutResponse = new LinkedList<Request>(); for (Entry<Long, ResponsePayload> payload : payloads.entrySet()) { if (payload.getValue() == null) { requestsWithoutResponse.add(requests.get(payload.getKey())); } } return Collections.unmodifiableCollection(requestsWithoutResponse); } @Override public Collection<Request> getAllRequests() { return Collections.unmodifiableCollection(requests.values()); } }