/*
* Copyright 2013, The Sporting Exchange Limited
*
* 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.betfair.cougar.transformations;
import com.betfair.cougar.transformations.manglers.CommonTypesMangler;
import com.betfair.cougar.transformations.manglers.ResponseToSimpleResponseMangler;
import com.betfair.cougar.transformations.manglers.SimpleTypeMangler;
import com.betfair.cougar.transformations.validators.DataTypeValidator;
import com.betfair.cougar.transformations.validators.ExceptionValidator;
import com.betfair.cougar.transformations.validators.MapsValidator;
import com.betfair.cougar.transformations.validators.NameClashValidator;
import com.betfair.cougar.transformations.validators.OperationValidator;
import com.betfair.cougar.transformations.validators.ParameterNameValidator;
import com.betfair.cougar.transformations.validators.RequestParameterValidator;
import com.betfair.cougar.transformations.validators.UnknownDataTypeValidator;
import com.betfair.cougar.transformations.validators.ValidValuesValidator;
import com.betfair.cougar.codegen.DocumentMangler;
import com.betfair.cougar.codegen.NodeExcluder;
import com.betfair.cougar.codegen.Transformation;
import static com.betfair.cougar.codegen.Transformation.OutputDomain;
import com.betfair.cougar.codegen.Transformations;
import com.betfair.cougar.codegen.Validator;
import org.w3c.dom.Node;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.logging.Logger;
public class CougarTransformations implements Transformations{
protected List<Transformation> transformations = new ArrayList<Transformation>();
protected List<Validator> validations = new ArrayList<Validator>();
protected List<DocumentMangler> manglers = new ArrayList<DocumentMangler>();
private static final NodeExcluder VoidResponseExcluder = new NodeExcluder() {
public boolean exclude(XPath xp, Node node) {
try {
final XPathExpression expr = xp.compile("parameters/simpleResponse/@type");
final String result = (String)expr.evaluate(node, XPathConstants.STRING);
return result.equals("void");
} catch (XPathExpressionException ex) {
throw new RuntimeException(ex);
}
}
};
public CougarTransformations() {
super();
Transformation[] definitions = new Transformation[] {
//directory name should not contain / at the end
new Transformation("interface.ftl", "/interface", "${package}/${majorVersion}", "${name}Service.java", false, false, OutputDomain.Server),
new Transformation("asyncServiceInterface.ftl", "/interface", "${package}/${majorVersion}", "${name}AsyncService.java", false, false, OutputDomain.Server),
new Transformation("serviceDefinition.ftl", "/interface", "${package}/${majorVersion}", "${name}ServiceDefinition.java", false, false, OutputDomain.Client_and_Server),
new Transformation("serviceExecutableResolver.ftl", "/interface", "${package}/${majorVersion}", "${name}ServiceExecutableResolver.java", false, false, OutputDomain.Server),
new Transformation("syncServiceExecutableResolver.ftl", "/interface", "${package}/${majorVersion}", "${name}SyncServiceExecutableResolver.java", false, false, OutputDomain.Server),
new Transformation("client.ftl", "/interface", "${package}/${majorVersion}", "${name}Client.java", false, false, OutputDomain.Client_and_Server),
new Transformation("client-impl.ftl", "/interface", "${package}/${majorVersion}", "${name}ClientImpl.java", false, false, OutputDomain.Client_and_Server),
new Transformation("clientExecutableResolver.ftl", "/interface", "${package}/${majorVersion}", "${name}ClientExecutableResolver.java", false, false, OutputDomain.Client),
new Transformation("clientFactory.ftl", "/interface", "${package}/${majorVersion}", "${name}ClientFactory.java", false, false, OutputDomain.Client),
new Transformation("clientSyncServiceImpl.ftl", "/interface", "${package}/${majorVersion}", "${name}SyncClientImpl.java", false, false, OutputDomain.Client_and_Server),
new Transformation("clientSyncServiceInterface.ftl", "/interface", "${package}/${majorVersion}", "${name}SyncClient.java", false, false, OutputDomain.Client_and_Server),
new Transformation("dataType.ftl", "/interface/dataType", "${package}/${majorVersion}/to", "${name}.java", true, false, OutputDomain.Client_and_Server),
new Transformation("dataTypeDelegate.ftl", "/interface/dataType", "${package}/${majorVersion}/to", "${name}Delegate.java", false, false, OutputDomain.Client_and_Server),
new Transformation("events/event.ftl", "/interface/event", "${package}/${majorVersion}/events", "${name}.java", true, false, OutputDomain.Client_and_Server),
new Transformation("events/jmsServiceBindingDescriptor.ftl", "/interface", "${package}/${majorVersion}/events", "${name}JMSServiceBindingDescriptor.java", true, false, OutputDomain.Client_and_Server),
new Transformation("exception.ftl", "/interface/exceptionType", "${package}/${majorVersion}/exception", "${name}.java",false, false, OutputDomain.Client_and_Server),
new Transformation("exceptionFactory.ftl", "/interface", "${package}/${majorVersion}/exception", "${name}ExceptionFactory.java",false, false, OutputDomain.Client_and_Server),
new Transformation("enum.ftl", "//parameter/validValues", "${package}/${majorVersion}/enumerations", "${name}Enum.java",true, true, OutputDomain.Client_and_Server),
new Transformation("wrappedValueEnum.ftl", "//simpleResponse/validValues", "${package}/${majorVersion}/enumerations", "${name}WrappedValueEnum.java",true, false, OutputDomain.Client_and_Server),
new Transformation("wrappedValueEnum.ftl", "//response/validValues", "${package}/${majorVersion}/enumerations", "${name}WrappedValueEnum.java",true, false, OutputDomain.Client_and_Server),
new Transformation("simpleTypeEnum.ftl", "/interface/simpleType/validValues", "${package}/${majorVersion}/enumerations", "${name}.java",true, false, OutputDomain.Client_and_Server),
new Transformation("jsonrpc/jsonRpcServiceBindingDescriptor.ftl", "/interface", "${package}/${majorVersion}/jsonrpc", "${name}JsonRpcServiceBindingDescriptor.java", false, false, OutputDomain.Client_and_Server),
new Transformation("rescript/requestDataType.ftl", "/interface/operation", "${package}/${majorVersion}/rescript", "${name}Request.java", true, false, OutputDomain.Client_and_Server),
new Transformation("rescript/responseDataType.ftl", "/interface/operation", "${package}/${majorVersion}/rescript", "${name}Response.java", true, false, OutputDomain.Client_and_Server, VoidResponseExcluder),
new Transformation("rescript/rescriptServiceBindingDescriptor.ftl", "/interface", "${package}/${majorVersion}/rescript", "${name}RescriptServiceBindingDescriptor.java", false, false, OutputDomain.Client_and_Server),
new Transformation("SOAP/soapServiceBindingDescriptor.ftl", "/interface", "${package}/${majorVersion}/soap", "${name}SoapServiceBindingDescriptor.java", false, false, OutputDomain.Client_and_Server),
new Transformation("socket/socketServiceBindingDescriptor.ftl", "/interface", "${package}/${majorVersion}/socket", "${name}SocketServiceBindingDescriptor.java", false, false, OutputDomain.Client_and_Server),
new Transformation("connectedDataType.ftl", "/interface/dataType", "interface:/interface", "${package}/${majorVersion}/co", "${name}CO.java", false, false, OutputDomain.Client_and_Server, null),
new Transformation("serverConnectedDataType.ftl", "/interface/dataType", "interface:/interface", "${package}/${majorVersion}/co/server", "${name}ServerCO.java", false, false, OutputDomain.Server, null),
new Transformation("clientConnectedDataType.ftl", "/interface/dataType", "interface:/interface", "${package}/${majorVersion}/co/client", "${name}ClientCO.java", false, false, OutputDomain.Client, null)
};
transformations.addAll(Arrays.asList(definitions));
validations.add(new DataTypeValidator());
validations.add(new OperationValidator());
validations.add(new ExceptionValidator());
validations.add(new ValidValuesValidator());
validations.add(new RequestParameterValidator());
validations.add(new NameClashValidator());
validations.add(new MapsValidator());
validations.add(new UnknownDataTypeValidator());
validations.add(new ParameterNameValidator());
manglers.add(new CommonTypesMangler());
manglers.add(new SimpleTypeMangler());
manglers.add(new ResponseToSimpleResponseMangler());
}
@Override
public List<Transformation> getTransformations() {
return transformations;
}
@Override
public List<Validator> getPreValidations() {
return validations;
}
@Override
public List<DocumentMangler> getManglers() {
return manglers;
}
}