/**
* Licensed to the Austrian Association for Software Tool Integration (AASTI)
* under one or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information regarding copyright
* ownership. The AASTI licenses this file to you 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.openengsb.core.services.internal;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.NoSuchElementException;
import org.openengsb.core.ekb.api.TransformationEngine;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
public abstract class TransformationHandler {
protected Method targetMethod;
public static TransformationHandler newTransformationHandler(TransformationEngine transformationEngine,
Method sourceMethod, Class<?> targetClass) {
if (targetClass == null) {
return new PassThroughTransformationHandler(sourceMethod);
}
Method targetMethod = findTargetMethod(sourceMethod, targetClass);
return new EngineTransformationHandler(transformationEngine, targetMethod);
}
protected TransformationHandler(Method targetMethod) {
this.targetMethod = targetMethod;
}
public Object[] transformArguments(Object[] args) {
return transformArguments(args, targetMethod.getParameterTypes());
}
protected abstract Object[] transformArguments(Object[] args, Class<?>[] parameterTypes);
public Object transformResult(Object result) {
return transformObject(result, targetMethod.getReturnType());
}
protected abstract Object transformObject(Object result, Class<?> returnType);
public Method getTargetMethod() {
return targetMethod;
}
/**
* tries to find a method that method in the class {@code target} with the same name and the same number of
* arguments. It's assumed that the arguments can then be transformed.
*
* @throws java.util.NoSuchElementException
* if no matching method can be found
*/
protected static Method findTargetMethod(final Method sourceMethod, Class<?> target) throws NoSuchElementException {
return Iterables.find(Arrays.asList(target.getMethods()), new Predicate<Method>() {
@Override
public boolean apply(Method element) {
if (!sourceMethod.getName().equals(element.getName())) {
return false;
}
if (sourceMethod.getParameterTypes().length != element.getParameterTypes().length) {
return false;
}
return true;
}
});
}
}