/* * Copyright 2008 Federal Chancellery Austria and * Graz University of Technology * * 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 at.gv.egiz.bku.slcommands.impl; import java.util.Iterator; import java.util.List; import java.util.NoSuchElementException; import javax.xml.bind.JAXBElement; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import at.gv.egiz.bku.slcommands.SLCommand; import at.gv.egiz.bku.slcommands.SLCommandContext; import at.gv.egiz.bku.slexceptions.SLCommandException; import at.gv.egiz.stal.ErrorResponse; import at.gv.egiz.stal.STAL; import at.gv.egiz.stal.STALRequest; import at.gv.egiz.stal.STALResponse; /** * This class serves as abstract base class for the implementation of a security * layer command. * * @author mcentner * * @param * the type of the corresponding request value */ public abstract class SLCommandImpl implements SLCommand { /** * The SLCommandContext for this SLCommand. */ protected SLCommandContext cmdCtx; /** * The request element of this command. */ protected JAXBElement request; /** * An iterator over the STALResponses received in * {@link SLCommandImpl#requestSTAL(List)}. */ protected Iterator stalResponses; @SuppressWarnings("unchecked") @Override public void init(SLCommandContext ctx, Object request) throws SLCommandException { this.request = (JAXBElement) request; this.cmdCtx = ctx; assert this.cmdCtx != null; } /** * Returns the request value. * * It is a convenience method for request.getValue(). * * @see JAXBElement#getValue() * @return the request value */ protected T getRequestValue() { return request.getValue(); } /** * @return the corresponding SLCommandContext */ protected SLCommandContext getCmdCtx() { return cmdCtx; } /** * Calls {@link STAL#handleRequest(List)} with the given * stalRequests. * * @param stalRequests * @throws SLCommandException */ protected void requestSTAL(List stalRequests) throws SLCommandException { List responses = cmdCtx.getSTAL().handleRequest(stalRequests); if (responses == null) { Log log = LogFactory.getLog(this.getClass()); log.info("Received no responses from STAL."); throw new SLCommandException(4000); } else if (responses.size() != stalRequests.size()) { Log log = LogFactory.getLog(this.getClass()); log.info("Received invalid count of responses from STAL. Expected " + stalRequests.size() + ", but got " + responses.size() + "."); // throw new SLCommandException(4000); } stalResponses = responses.iterator(); } /** * @return true if there are more {@link STALResponse}s to be * fetched with {@link #nextResponse(Class)}, or false * otherwise. */ protected boolean hasNextResponse() { return (stalResponses != null) ? stalResponses.hasNext() : false; } /** * Returns the next response of type responseClass that has been * received by {@link #requestSTAL(List)}. * * @param responseClass * the response must be an instance of * @return the next response of type responseClass * * @throws NoSuchElementException * if there is no more response * @throws SLCommandException * if the next response is of type {@link ErrorResponse} or not of * type responseClass */ protected STALResponse nextResponse( Class responseClass) throws SLCommandException { if (stalResponses == null) { throw new NoSuchElementException(); } STALResponse response = stalResponses.next(); if (response instanceof ErrorResponse) { throw new SLCommandException(((ErrorResponse) response).getErrorCode()); } if (!(responseClass.isAssignableFrom(response.getClass()))) { Log log = LogFactory.getLog(this.getClass()); log.info("Received " + response.getClass() + " from STAL but expected " + responseClass); throw new SLCommandException(4000); } return response; } }