blob: 030bcaf26d3dd4924e7e2ffeae3045814b63a4e6 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF 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.apache.axis2.corba.deployer;
import org.apache.axiom.om.OMAttribute;
import org.apache.axiom.om.OMElement;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.AddressingHelper;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.corba.idl.types.DataType;
import org.apache.axis2.corba.idl.types.ExceptionType;
import org.apache.axis2.corba.idl.types.IDL;
import org.apache.axis2.corba.idl.types.Interface;
import org.apache.axis2.corba.idl.types.Operation;
import org.apache.axis2.corba.receivers.CorbaUtil;
import org.apache.axis2.deployment.Deployer;
import org.apache.axis2.deployment.DeploymentConstants;
import org.apache.axis2.deployment.DeploymentEngine;
import org.apache.axis2.deployment.DeploymentErrorMsgs;
import org.apache.axis2.deployment.DeploymentException;
import org.apache.axis2.deployment.DescriptionBuilder;
import org.apache.axis2.deployment.repository.util.DeploymentFileData;
import org.apache.axis2.deployment.util.PhasesInfo;
import org.apache.axis2.deployment.util.Utils;
import org.apache.axis2.description.AxisMessage;
import org.apache.axis2.description.AxisOperation;
import org.apache.axis2.description.AxisOperationFactory;
import org.apache.axis2.description.AxisService;
import org.apache.axis2.description.AxisServiceGroup;
import org.apache.axis2.description.Parameter;
import org.apache.axis2.description.ParameterInclude;
import org.apache.axis2.description.java2wsdl.Java2WSDLConstants;
import org.apache.axis2.description.java2wsdl.TypeTable;
import org.apache.axis2.engine.AxisConfiguration;
import org.apache.axis2.engine.MessageReceiver;
import org.apache.axis2.jaxws.i18n.Messages;
import org.apache.axis2.util.Loader;
import org.apache.axis2.wsdl.WSDLConstants;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.ws.commons.schema.utils.NamespaceMap;
import org.omg.CORBA_2_3.ORB;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLStreamException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
public class CorbaDeployer implements Deployer, DeploymentConstants, CorbaConstants {
private static final Log log = LogFactory.getLog(CorbaDeployer.class);
private AxisConfiguration axisConfig;
private ConfigurationContext configCtx;
public void init(ConfigurationContext configCtx) {
this.configCtx = configCtx;
this.axisConfig = this.configCtx.getAxisConfiguration();
/*try {
System.in.read();
} catch (IOException e) {
}*/
}
public void deploy(DeploymentFileData deploymentFileData) throws DeploymentException {
String name = null;
try {
deploymentFileData.setClassLoader(axisConfig.getServiceClassLoader());
AxisServiceGroup serviceGroup = new AxisServiceGroup(axisConfig);
serviceGroup.setServiceGroupClassLoader(deploymentFileData.getClassLoader());
ArrayList serviceList = processService(deploymentFileData, serviceGroup, configCtx);
DeploymentEngine.addServiceGroup(serviceGroup, serviceList, deploymentFileData.getFile().toURL(), deploymentFileData, axisConfig);
name = deploymentFileData.getName();
log.info("Deploying " + name);
} catch (AxisFault axisFault) {
log.error("Error while deploying " + name, axisFault);
} catch (MalformedURLException e) {
log.error("Error while deploying " + name, e);
} catch (Exception e) {
log.error("Error while deploying " + name, e);
}
}
private ArrayList processService(DeploymentFileData deploymentFileData, AxisServiceGroup serviceGroup, ConfigurationContext configCtx) throws Exception {
String filename = deploymentFileData.getAbsolutePath();
File file = new File(filename);
serviceGroup.setServiceGroupName(deploymentFileData.getName());
String serviceName = DescriptionBuilder.getShortFileName(deploymentFileData.getName());
AxisService axisService = new AxisService();
axisService.setName(serviceName);
axisService.setParent(serviceGroup);
axisService.setClassLoader(deploymentFileData.getClassLoader());
InputStream in = null;
try {
in = new FileInputStream(file);
DescriptionBuilder builder = new DescriptionBuilder(in, configCtx);
OMElement rootElement = builder.buildOM();
String elementName = rootElement.getLocalName();
if (TAG_SERVICE.equals(elementName)) {
populateService(axisService, rootElement, file.getParent());
} else {
throw new AxisFault("Invalid " + deploymentFileData.getAbsolutePath() + " found");
}
} catch (FileNotFoundException e) {
throw new DeploymentException(Messages.getMessage(
DeploymentErrorMsgs.FILE_NOT_FOUND, e.getMessage()));
} catch (XMLStreamException e) {
throw new DeploymentException(Messages.getMessage(
DeploymentErrorMsgs.XML_STREAM_EXCEPTION, e.getMessage()));
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
log.info(Messages.getMessage("errorininputstreamclose"));
}
}
}
ArrayList serviceList = new ArrayList();
serviceList.add(axisService);
return serviceList;
}
private void populateService(AxisService service, OMElement service_element, String directory)
throws DeploymentException {
try {
// Processing service level parameters
Iterator itr = service_element.getChildrenWithName(new QName(TAG_PARAMETER));
processParameters(itr, service, service.getParent());
// process service description
OMElement descriptionElement = service_element.getFirstChildWithName(new QName(TAG_DESCRIPTION));
if (descriptionElement != null) {
OMElement descriptionValue = descriptionElement.getFirstElement();
if (descriptionValue != null) {
StringWriter writer = new StringWriter();
descriptionValue.build();
descriptionValue.serialize(writer);
writer.flush();
service.setDocumentation(writer.toString());
} else {
service.setDocumentation(descriptionElement.getText());
}
} else {
OMAttribute serviceNameatt = service_element.getAttribute(new QName(ATTRIBUTE_NAME));
if (serviceNameatt != null) {
if (!"".equals(serviceNameatt.getAttributeValue().trim())) {
service.setDocumentation(serviceNameatt.getAttributeValue());
}
}
}
OMAttribute serviceNameatt = service_element.getAttribute(new QName(ATTRIBUTE_NAME));
// If the service name is explicitly specified in the services.xml
// then use that as the service name
if (serviceNameatt != null) {
if (!"".equals(serviceNameatt.getAttributeValue().trim())) {
service.setName(serviceNameatt.getAttributeValue());
// To be on the safe side
if (service.getDocumentation() == null) {
service.setDocumentation(serviceNameatt.getAttributeValue());
}
}
}
// Process WS-Addressing flag attribute
OMAttribute addressingRequiredatt = service_element.getAttribute(new QName(
ATTRIBUTE_WSADDRESSING));
if (addressingRequiredatt != null) {
String addressingRequiredString = addressingRequiredatt.getAttributeValue();
AddressingHelper.setAddressingRequirementParemeterValue(service, addressingRequiredString);
}
// Setting service target namespace if any
OMAttribute targetNameSpace = service_element.getAttribute(new QName(TARGET_NAME_SPACE));
if (targetNameSpace != null) {
String nameSpeceVale = targetNameSpace.getAttributeValue();
if (nameSpeceVale != null && !"".equals(nameSpeceVale)) {
service.setTargetNamespace(nameSpeceVale);
}
} else {
if (service.getTargetNamespace() == null || "".equals(service.getTargetNamespace())) {
service.setTargetNamespace(Java2WSDLConstants.DEFAULT_TARGET_NAMESPACE);
}
}
// Setting schema namespece if any
OMElement schemaElement = service_element.getFirstChildWithName(new QName(SCHEMA));
if (schemaElement != null) {
OMAttribute schemaNameSpace = schemaElement.getAttribute(new QName(SCHEMA_NAME_SPACE));
if (schemaNameSpace != null) {
String nameSpeceVale = schemaNameSpace.getAttributeValue();
if (nameSpeceVale != null && !"".equals(nameSpeceVale)) {
service.setSchemaTargetNamespace(nameSpeceVale);
}
}
OMAttribute elementFormDefault = schemaElement.getAttribute(new QName(
SCHEMA_ELEMENT_QUALIFIED));
if (elementFormDefault != null) {
String value = elementFormDefault.getAttributeValue();
if ("true".equals(value)) {
service.setElementFormDefault(true);
} else if ("false".equals(value)) {
service.setElementFormDefault(false);
}
}
}
// Removing exclude operations
OMElement excludeOperations = service_element.getFirstChildWithName(new QName(TAG_EXCLUDE_OPERATIONS));
ArrayList excludeops = null;
if (excludeOperations != null) {
excludeops = new ArrayList();
Iterator excludeOp_itr = excludeOperations.getChildrenWithName(new QName(TAG_OPERATION));
while (excludeOp_itr.hasNext()) {
OMElement opName = (OMElement) excludeOp_itr.next();
excludeops.add(opName.getText().trim());
}
}
if (excludeops == null) {
excludeops = new ArrayList();
}
// processing service-wide modules which required to engage globally
Iterator moduleRefs = service_element.getChildrenWithName(new QName(TAG_MODULE));
while (moduleRefs.hasNext()) {
OMElement moduleref = (OMElement) moduleRefs.next();
OMAttribute moduleRefAttribute = moduleref.getAttribute(new QName(TAG_REFERENCE));
String refName = moduleRefAttribute.getAttributeValue();
axisConfig.addGlobalModuleRef(refName);
}
OMElement messageReceiver = service_element.getFirstChildWithName(
new QName(TAG_MESSAGE_RECEIVERS));
ClassLoader loader = service.getClassLoader();
// Set default message recievers
service.addMessageReceiver("http://www.w3.org/2004/08/wsdl/in-only",
loadMessageReceiver(loader, "org.apache.axis2.corba.receivers.CorbaInOnlyMessageReceiver"));
service.addMessageReceiver("http://www.w3.org/2004/08/wsdl/robust-in-only",
loadMessageReceiver(loader, "org.apache.axis2.corba.receivers.CorbaInOnlyMessageReceiver"));
service.addMessageReceiver("http://www.w3.org/2004/08/wsdl/in-out",
loadMessageReceiver(loader, "org.apache.axis2.corba.receivers.CorbaMessageReceiver"));
service.addMessageReceiver("http://www.w3.org/2004/08/wsdl/in-opt-out",
loadMessageReceiver(loader, "org.apache.axis2.corba.receivers.CorbaInOutAsyncMessageReceiver"));
if (messageReceiver != null) {
HashMap mrs = processMessageReceivers(loader, messageReceiver);
Iterator keys = mrs.keySet().iterator();
while (keys.hasNext()) {
String key = (String) keys.next();
service.addMessageReceiver(key, (MessageReceiver) mrs.get(key));
}
}
// processing transports
OMElement transports = service_element.getFirstChildWithName(new QName(TAG_TRANSPORTS));
if (transports != null) {
Iterator transport_itr = transports.getChildrenWithName(new QName(TAG_TRANSPORT));
ArrayList trs = new ArrayList();
while (transport_itr.hasNext()) {
OMElement trsEle = (OMElement) transport_itr.next();
String tarnsportName = trsEle.getText().trim();
trs.add(tarnsportName);
}
service.setExposedTransports(trs);
}
// processing operations
processOperations(service, axisConfig, excludeops, null, directory);
Iterator operationsIterator = service.getOperations();
while (operationsIterator.hasNext()) {
AxisOperation operationDesc = (AxisOperation) operationsIterator.next();
ArrayList wsamappings = operationDesc.getWSAMappingList();
if (wsamappings == null) {
continue;
}
if (service.getOperation(operationDesc.getName()) == null) {
service.addOperation(operationDesc);
}
for (int j = 0; j < wsamappings.size(); j++) {
String mapping = (String) wsamappings.get(j);
if (mapping.length() > 0) {
service.mapActionToOperation(mapping, operationDesc);
}
}
}
for (int i = 0; i < excludeops.size(); i++) {
String opName = (String) excludeops.get(i);
service.removeOperation(new QName(opName));
}
} catch (XMLStreamException e) {
throw new DeploymentException(e);
} catch (AxisFault axisFault) {
throw new DeploymentException(Messages.getMessage(
DeploymentErrorMsgs.OPERATION_PROCESS_ERROR, axisFault.getMessage()), axisFault);
} catch (Exception e) {
throw new DeploymentException(e);
}
}
protected HashMap processMessageReceivers(ClassLoader loader, OMElement element) throws DeploymentException {
HashMap meps = new HashMap();
Iterator iterator = element.getChildrenWithName(new QName(TAG_MESSAGE_RECEIVER));
while (iterator.hasNext()) {
OMElement receiverElement = (OMElement) iterator.next();
OMAttribute receiverName = receiverElement.getAttribute(new QName(TAG_CLASS_NAME));
String className = receiverName.getAttributeValue();
MessageReceiver receiver = loadMessageReceiver(loader, className);
OMAttribute mepAtt = receiverElement.getAttribute(new QName(TAG_MEP));
meps.put(mepAtt.getAttributeValue(), receiver);
}
return meps;
}
protected MessageReceiver loadMessageReceiver(ClassLoader loader, String className) throws DeploymentException {
MessageReceiver receiver = null;
try {
Class messageReceiver;
if ((className != null) && !"".equals(className)) {
messageReceiver = Loader.loadClass(loader, className);
receiver = (MessageReceiver) messageReceiver.newInstance();
}
} catch (ClassNotFoundException e) {
throw new DeploymentException(org.apache.axis2.i18n.Messages.getMessage(
DeploymentErrorMsgs.ERROR_IN_LOADING_MESSAGE_RECEIVER,
"ClassNotFoundException", className), e);
} catch (IllegalAccessException e) {
throw new DeploymentException(org.apache.axis2.i18n.Messages.getMessage(
DeploymentErrorMsgs.ERROR_IN_LOADING_MESSAGE_RECEIVER,
"IllegalAccessException", className), e);
} catch (InstantiationException e) {
throw new DeploymentException(org.apache.axis2.i18n.Messages.getMessage(
DeploymentErrorMsgs.ERROR_IN_LOADING_MESSAGE_RECEIVER,
"InstantiationException", className), e);
}
return receiver;
}
private void processParameters(Iterator parameters, ParameterInclude parameterInclude,
ParameterInclude parent) throws DeploymentException {
while (parameters.hasNext()) {
// this is to check whether some one has locked the parmeter at the
// top level
OMElement parameterElement = (OMElement) parameters.next();
Parameter parameter = new Parameter();
// setting parameterElement
parameter.setParameterElement(parameterElement);
// setting parameter Name
OMAttribute paramName = parameterElement.getAttribute(new QName(ATTRIBUTE_NAME));
if (paramName == null) {
throw new DeploymentException(Messages.getMessage(
DeploymentErrorMsgs.BAD_PARAMETER_ARGUMENT, parameterElement.toString()));
}
parameter.setName(paramName.getAttributeValue());
// setting parameter Value (the child element of the parameter)
OMElement paramValue = parameterElement.getFirstElement();
if (paramValue != null) {
parameter.setValue(parameterElement);
parameter.setParameterType(Parameter.OM_PARAMETER);
} else {
String paratextValue = parameterElement.getText();
parameter.setValue(paratextValue);
parameter.setParameterType(Parameter.TEXT_PARAMETER);
}
// setting locking attribute
OMAttribute paramLocked = parameterElement.getAttribute(new QName(ATTRIBUTE_LOCKED));
Parameter parentParam = null;
if (parent != null) {
parentParam = parent.getParameter(parameter.getName());
}
if (paramLocked != null) {
String lockedValue = paramLocked.getAttributeValue();
if (BOOLEAN_TRUE.equals(lockedValue)) {
// if the parameter is locked at some level parameter value
// replace by that
if ((parent != null) && parent.isParameterLocked(parameter.getName())) {
throw new DeploymentException(Messages.getMessage(
DeploymentErrorMsgs.CONFIG_NOT_FOUND, parameter.getName()));
} else {
parameter.setLocked(true);
}
} else {
parameter.setLocked(false);
}
}
try {
if (parent != null) {
if ((parentParam == null) || !parent.isParameterLocked(parameter.getName())) {
parameterInclude.addParameter(parameter);
}
} else {
parameterInclude.addParameter(parameter);
}
} catch (AxisFault axisFault) {
throw new DeploymentException(axisFault);
}
}
}
private void processOperations(AxisService axisService,
AxisConfiguration axisConfig,
ArrayList excludeOperations,
ArrayList nonRpcMethods, String dirName) throws Exception {
ORB orb = CorbaUtil.getORB(axisService);
IDL idl = CorbaUtil.getIDL(axisService, orb, dirName);
Parameter orbParam = new Parameter(ORB_LITERAL, orb);
Parameter idlParam = new Parameter(IDL_LITERAL, idl);
axisService.addParameter(orbParam);
axisService.addParameter(idlParam);
// adding name spaces
NamespaceMap map = new NamespaceMap();
map.put(Java2WSDLConstants.AXIS2_NAMESPACE_PREFIX, Java2WSDLConstants.AXIS2_XSD);
map.put(Java2WSDLConstants.DEFAULT_SCHEMA_NAMESPACE_PREFIX, Java2WSDLConstants.URI_2001_SCHEMA_XSD);
axisService.setNamespaceMap(map);
Parameter interfaceNameParam = axisService.getParameter(INTERFACE_NAME);
String interfaceName = (String) ((interfaceNameParam==null) ? null : interfaceNameParam.getValue());
SchemaGenerator schemaGenerator = new SchemaGenerator(idl, interfaceName,
axisService.getSchemaTargetNamespace(),
axisService.getSchemaTargetNamespacePrefix());
schemaGenerator.setExcludeMethods(excludeOperations);
schemaGenerator.setNonRpcMethods(nonRpcMethods);
if (!axisService.isElementFormDefault()) {
schemaGenerator.setElementFormDefault(Java2WSDLConstants.FORM_DEFAULT_UNQUALIFIED);
}
// package to namespace map
schemaGenerator.setPkg2nsmap(axisService.getP2nMap());
Collection schemas = schemaGenerator.generateSchema();
axisService.addSchema(schemas);
axisService.setSchemaTargetNamespace(schemaGenerator.getSchemaTargetNameSpace());
axisService.setTypeTable(schemaGenerator.getTypeTable());
if (Java2WSDLConstants.DEFAULT_TARGET_NAMESPACE.equals(
axisService.getTargetNamespace())) {
axisService.setTargetNamespace(schemaGenerator.getTargetNamespace());
}
Interface intf = (Interface) idl.getInterfaces().get(interfaceName);
Operation[] operations = intf.getOperations();
TypeTable table = schemaGenerator.getTypeTable();
PhasesInfo pinfo = axisConfig.getPhasesInfo();
for (int i = 0; i < operations.length; i++) {
Operation corbaOperation = operations[i];
String opName = corbaOperation.getName();
if (excludeOperations != null && excludeOperations.contains(opName)) {
continue;
}
AxisOperation operation = axisService.getOperation(new QName(opName));
// if the operation there in services.xml then try to set it schema element name
if (operation != null) {
AxisMessage inMessage = operation.getMessage(
WSDLConstants.MESSAGE_LABEL_IN_VALUE);
if (inMessage != null) {
inMessage.setName(opName + Java2WSDLConstants.MESSAGE_SUFFIX);
QName complexSchemaType = table.getComplexSchemaType(opName);
inMessage.setElementQName(complexSchemaType);
if (complexSchemaType != null) {
axisService.addMessageElementQNameToOperationMapping(complexSchemaType,
operation);
}
}
DataType returnType = corbaOperation.getReturnType();
if (returnType != null && !CorbaUtil.getQualifiedName(returnType).equals(VOID)) {
AxisMessage outMessage = operation.getMessage(WSDLConstants.MESSAGE_LABEL_OUT_VALUE);
QName qNamefortheType = table.getQNamefortheType(opName + RESPONSE);
outMessage.setElementQName(qNamefortheType);
if (qNamefortheType != null) {
axisService.addMessageElementQNameToOperationMapping(qNamefortheType, operation);
}
outMessage.setName(opName + RESPONSE);
}
if (corbaOperation.hasRaises()) {
List extypes = corbaOperation.getRaises();
for (int j = 0; j < extypes.size(); j++) {
AxisMessage faultMessage = new AxisMessage();
ExceptionType extype = (ExceptionType) extypes.get(j);
String exname = extype.getName() ;
if(extypes.size()>1){
faultMessage.setName(opName + FAULT + j);
} else{
faultMessage.setName(opName + FAULT);
}
faultMessage.setElementQName(
table.getComplexSchemaType(exname + FAULT));
operation.setFaultMessages(faultMessage);
}
}
} else {
operation = getAxisOperationforCorbaOperation(corbaOperation, table);
MessageReceiver mr = axisService.getMessageReceiver(
operation.getMessageExchangePattern());
if (mr != null) {
operation.setMessageReceiver(mr);
} else {
mr = axisConfig.getMessageReceiver(operation.getMessageExchangePattern());
operation.setMessageReceiver(mr);
}
pinfo.setOperationPhases(operation);
axisService.addOperation(operation);
}
if (operation.getInputAction() == null) {
operation.setSoapAction("urn:" + opName);
}
}
}
private AxisOperation getAxisOperationforCorbaOperation(Operation corbaOperation,
TypeTable table) throws AxisFault {
AxisOperation operation;
String opName = corbaOperation.getName();
DataType returnType = corbaOperation.getReturnType();
if (returnType == null || CorbaUtil.getQualifiedName(returnType).equals(VOID)) {
if (corbaOperation.hasRaises()) {
operation = AxisOperationFactory.getAxisOperation(WSDLConstants.MEP_CONSTANT_IN_OUT);
AxisMessage outMessage = operation.getMessage(
WSDLConstants.MESSAGE_LABEL_OUT_VALUE);
outMessage.setElementQName(table.getQNamefortheType(opName + RESPONSE));
outMessage.setName(opName + RESPONSE);
} else {
operation = AxisOperationFactory.getAxisOperation(WSDLConstants.MEP_CONSTANT_IN_ONLY);
}
} else {
operation = AxisOperationFactory.getAxisOperation(WSDLConstants.MEP_CONSTANT_IN_OUT);
AxisMessage outMessage = operation.getMessage(
WSDLConstants.MESSAGE_LABEL_OUT_VALUE);
outMessage.setElementQName(table.getQNamefortheType(opName + RESPONSE));
outMessage.setName(opName + RESPONSE);
}
if (corbaOperation.hasRaises()) {
List extypes = corbaOperation.getRaises();
for (int j= 0 ; j < extypes.size() ; j++) {
AxisMessage faultMessage = new AxisMessage();
ExceptionType extype = (ExceptionType) extypes.get(j);
String exname = extype.getName() ;
if(extypes.size() >1){
faultMessage.setName(opName + FAULT + j);
} else {
faultMessage.setName(opName + FAULT);
}
faultMessage.setElementQName(
table.getComplexSchemaType(exname + FAULT));
operation.setFaultMessages(faultMessage);
}
}
operation.setName(new QName(opName));
AxisMessage inMessage = operation.getMessage(WSDLConstants.MESSAGE_LABEL_IN_VALUE);
if (inMessage != null) {
inMessage.setElementQName(table.getComplexSchemaType(opName));
inMessage.setName(opName + Java2WSDLConstants.MESSAGE_SUFFIX);
}
return operation;
}
public void setDirectory(String directory) {
}
public void setExtension(String extension) {
}
public void unDeploy(String fileName) throws DeploymentException {
try {
fileName = Utils.getShortFileName(fileName);
axisConfig.removeServiceGroup(fileName);
log.info(Messages.getMessage(DeploymentErrorMsgs.SERVICE_REMOVED, fileName));
} catch (AxisFault axisFault) {
axisConfig.removeFaultyService(fileName);
}
}
}