package com.delcyon.capo.controller.elements; import com.delcyon.capo.CapoApplication; import com.delcyon.capo.controller.AbstractControl; import com.delcyon.capo.controller.ControlElementProvider; import com.delcyon.capo.resourcemanager.ResourceDescriptor; import com.delcyon.capo.resourcemanager.ResourceParameterBuilder; import com.delcyon.capo.resourcemanager.ResourceDescriptor.State; @ControlElementProvider(name="step") public class StepElement extends AbstractControl { private enum Attributes { resource, until, timeout } public enum Parameters { UNTIL, TIMEOUT } private static final String[] supportedNamespaces = {CapoApplication.SERVER_NAMESPACE_URI}; @Override public Attributes[] getAttributes() { return Attributes.values(); } @Override public Attributes[] getRequiredAttributes() { return new Attributes[]{Attributes.resource}; } @Override public String[] getSupportedNamespaces() { return supportedNamespaces; } @Override public Object processServerSideElement() throws Exception { Boolean result = false; String resource = getAttributeValue(Attributes.resource); if (resource.startsWith("resource:") == false) { resource = "resource:"+resource; } ResourceDescriptor resourceDescriptor = getParentGroup().getResourceDescriptor(this, resource); ResourceParameterBuilder resourceParameterBuilder = new ResourceParameterBuilder(); resourceParameterBuilder.addAll(getControlElementDeclaration()); String until = getAttributeValue(Attributes.until); if (until.isEmpty() == false) { resourceParameterBuilder.addParameter(Parameters.UNTIL, until); } String timeout = getAttributeValue(Attributes.timeout); if (timeout.isEmpty() == false && timeout.matches("\\d+")) { resourceParameterBuilder.addParameter(Parameters.TIMEOUT, timeout); } if (resourceDescriptor.getResourceState() == State.OPEN) { resourceDescriptor.open(getParentGroup(),resourceParameterBuilder.getParameters()); } if (resourceDescriptor.getResourceState() == State.STEPPING) { result = resourceDescriptor.next(getParentGroup(),resourceParameterBuilder.getParameters()); } return result; } }