1 package org.sapia.soto.state.cocoon; 2 3 import org.apache.avalon.framework.activity.Initializable; 4 import org.apache.avalon.framework.activity.Startable; 5 import org.apache.avalon.framework.component.Component; 6 import org.apache.avalon.framework.component.ComponentException; 7 import org.apache.avalon.framework.component.ComponentManager; 8 import org.apache.avalon.framework.component.Composable; 9 import org.apache.avalon.framework.logger.LogEnabled; 10 import org.apache.avalon.framework.logger.Logger; 11 import org.apache.avalon.framework.parameters.ParameterException; 12 import org.apache.avalon.framework.parameters.Parameterizable; 13 import org.apache.avalon.framework.parameters.Parameters; 14 import org.apache.avalon.framework.thread.ThreadSafe; 15 16 import org.apache.excalibur.source.SourceResolver; 17 18 import org.sapia.soto.SotoContainer; 19 import org.sapia.soto.state.util.StateIdParser; 20 import org.sapia.soto.util.Resource; 21 import org.sapia.soto.util.ResourceHandler; 22 import org.sapia.soto.util.UrlResource; 23 import org.sapia.soto.util.Utils; 24 25 import org.xml.sax.ContentHandler ; 26 27 import java.io.IOException ; 28 import java.io.InputStream ; 29 30 import java.net.URL ; 31 32 import java.util.Map ; 33 34 35 49 public class CocoonStateMachineComponentImpl 50 implements CocoonStateMachineComponent, LogEnabled, Initializable, Startable, 51 Composable, ThreadSafe, Parameterizable, Component { 52 public static final String SOTO_CONFIG = "soto-config"; 53 public static final String STATE_SERVICE_ID = "state-service-id"; 54 protected Logger _log; 55 protected ComponentManager _manager; 56 private String _sotoConfigResource; 57 private String _stateMachineId; 58 private SotoContainer _container; 59 60 63 public void enableLogging(Logger logger) { 64 _log = logger.getChildLogger(this.getClass().getName()); 65 } 66 67 70 public void initialize() throws Exception { 71 _container = new SotoContainer(); 72 _container.getResourceHandlers().append(new CocoonResourceHandler(this)); 73 _container.load(_sotoConfigResource); 74 } 75 76 79 public void parameterize(Parameters params) throws ParameterException { 80 _sotoConfigResource = params.getParameter(SOTO_CONFIG); 81 82 if (_sotoConfigResource == null) { 83 throw new ParameterException("Missing configuration parameter: " + 84 SOTO_CONFIG); 85 } 86 87 _stateMachineId = params.getParameter(STATE_SERVICE_ID); 88 89 if (_stateMachineId == null) { 90 throw new ParameterException("Missing configuration parameter: " + 91 STATE_SERVICE_ID); 92 } 93 } 94 95 98 public void start() throws Exception { 99 _container.start(); 100 } 101 102 105 public void stop() throws Exception { 106 _container.dispose(); 107 } 108 109 112 public void compose(ComponentManager manager) throws ComponentException { 113 _manager = manager; 114 } 115 116 119 public void execute(String stateId, Map objectModel, ContentHandler handler) 120 throws Exception { 121 CocoonStateMachineService service = (CocoonStateMachineService) _container.lookup(_stateMachineId); 122 StateIdParser.Created stateInfo = StateIdParser.parseStateFrom(stateId, 123 null); 124 125 if (stateInfo == null) { 126 throw new IllegalArgumentException ("Could not extract state identifier: " + 127 stateId); 128 } 129 130 service.execute(stateInfo.state, stateInfo.module, objectModel, handler); 131 } 132 133 protected Logger logger() { 134 return _log; 135 } 136 137 static final class CocoonResourceHandler implements ResourceHandler { 138 139 public static final String CONTEXT_SCHEME = "context"; 140 public static final String COCOON_SCHEME = "cocoon"; 141 CocoonStateMachineComponentImpl _owner; 142 143 CocoonResourceHandler(CocoonStateMachineComponentImpl owner) { 144 _owner = owner; 145 } 146 147 150 public InputStream getResource(String uri) throws IOException { 151 return getResourceObject(uri).getInputStream(); 152 } 153 154 157 public Resource getResourceObject(String uri) throws IOException { 158 SourceResolver res = null; 159 160 try { 161 res = (SourceResolver) _owner._manager.lookup(SourceResolver.ROLE); 162 String toResolve = Utils.chopScheme(uri); 163 toResolve = CONTEXT_SCHEME + "://" + Utils.chopScheme(uri); 164 165 return new UrlResource(new URL (toResolve)); 166 } catch (ComponentException e) { 167 throw new IOException (e.getMessage()); 168 } finally { 169 if (res != null) { 170 _owner._manager.release(res); 171 } 172 } 173 } 174 175 178 public boolean accepts(String uri) { 179 String scheme = Utils.getScheme(uri); 180 if(scheme == null || scheme.length() == 0){ 181 return true; 182 } 183 else if(scheme.equals(COCOON_SCHEME)){ 184 return true; 185 } 186 else{ 187 return false; 188 } 189 } 190 191 } 192 } 193 | Popular Tags |