/*
* Copyright 2003-2009 the original author or authors.
* 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 com.jdon.domain.message;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import com.jdon.async.disruptor.EventDisruptor;
import com.jdon.domain.message.consumer.ModelConsumerMethodHolder;
import com.jdon.util.Debug;
public class DomainCommandDispatchHandler implements DomainEventHandler<EventDisruptor> {
public final static String module = DomainCommandDispatchHandler.class.getName();
private ModelConsumerMethodHolder modelConsumerMethodHolder;
public DomainCommandDispatchHandler(ModelConsumerMethodHolder modelConsumerMethodHolder) {
super();
this.modelConsumerMethodHolder = modelConsumerMethodHolder;
}
@Override
public void onEvent(EventDisruptor event, final boolean endOfBatch) throws Exception {
try {
Method method = modelConsumerMethodHolder.getConsumerMethodHolder().getMethod();
Object model = ((Command) event.getDomainMessage()).getDestination();
if (model == null) {
Debug.logError("[Jdonframework]Destination that will be sent is null ", module);
return;
}
Class[] pTypes = method.getParameterTypes();
if (pTypes.length == 0) {
method.invoke(model, new Object[] {});
}
Object parameter = event.getDomainMessage().getEventSource();
if (parameter == null) {
Debug.logError("[Jdonframework]the publisher method with @Send need return type" + pTypes[0].getName(), module);
return;
}
Object[] parameters = new Object[pTypes.length];
int i = 0;
for (Class pType : pTypes) {
if (pType.isAssignableFrom(parameter.getClass())) {
parameters[i] = parameter;
} else {
// init other parameter to a instance;
if (!pType.isPrimitive()) {
try {
parameters[i] = pType.newInstance();
} catch (Exception e) {
Debug.logError("[Jdonframework] " + pType.getName() + " no default construtor :" + e, module);
e.printStackTrace();
}
} else
parameters[i] = defaultValues.get(pType);
}
i++;
}
Object eventResult = method.invoke(model, parameters);
event.getDomainMessage().setEventResult(eventResult);
} catch (Exception e) {
Debug.logError("[Jdonframework]" + modelConsumerMethodHolder.getConsumerMethodHolder().getClassName()
+ " method with @onCommand happended error: " + e, module);
}
}
private final static Map<Class<?>, Object> defaultValues = new HashMap<Class<?>, Object>();
static {
defaultValues.put(String.class, "");
defaultValues.put(Integer.class, 0);
defaultValues.put(int.class, 0);
defaultValues.put(Long.class, 0L);
defaultValues.put(long.class, 0L);
defaultValues.put(Character.class, '\0');
defaultValues.put(char.class, '\0');
// etc
}
}