2  * Copyright © 2016-2017 European Support Limited
 
   4  * Licensed under the Apache License, Version 2.0 (the "License");
 
   5  * you may not use this file except in compliance with the License.
 
   6  * You may obtain a copy of the License at
 
   8  *      http://www.apache.org/licenses/LICENSE-2.0
 
  10  * Unless required by applicable law or agreed to in writing, software
 
  11  * distributed under the License is distributed on an "AS IS" BASIS,
 
  12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  13  * See the License for the specific language governing permissions and
 
  14  * limitations under the License.
 
  17 package org.openecomp.core.impl;
 
  19 import static org.openecomp.core.converter.datatypes.Constants.ONAP_INDEX;
 
  20 import static org.openecomp.core.converter.datatypes.Constants.capabilities;
 
  21 import static org.openecomp.core.converter.datatypes.Constants.definitionsDir;
 
  22 import static org.openecomp.core.converter.datatypes.Constants.globalStName;
 
  23 import static org.openecomp.core.converter.datatypes.Constants.globalSubstitution;
 
  24 import static org.openecomp.core.converter.datatypes.Constants.inputs;
 
  25 import static org.openecomp.core.converter.datatypes.Constants.mainStName;
 
  26 import static org.openecomp.core.converter.datatypes.Constants.manifestFileName;
 
  27 import static org.openecomp.core.converter.datatypes.Constants.metadataFile;
 
  28 import static org.openecomp.core.converter.datatypes.Constants.nodeType;
 
  29 import static org.openecomp.core.converter.datatypes.Constants.openecompHeatIndex;
 
  30 import static org.openecomp.core.converter.datatypes.Constants.outputs;
 
  31 import static org.openecomp.core.converter.datatypes.Constants.requirements;
 
  32 import static org.openecomp.core.impl.GlobalSubstitutionServiceTemplate.GLOBAL_SUBSTITUTION_SERVICE_FILE_NAME;
 
  33 import static org.openecomp.core.impl.GlobalSubstitutionServiceTemplate.HEAT_INDEX_IMPORT_FILE;
 
  34 import static org.openecomp.core.impl.GlobalSubstitutionServiceTemplate.ONAP_INDEX_IMPORT_FILE;
 
  36 import org.apache.commons.collections.MapUtils;
 
  37 import org.openecomp.core.converter.ServiceTemplateReaderService;
 
  38 import org.openecomp.core.converter.ToscaConverter;
 
  39 import org.openecomp.core.converter.datatypes.Constants;
 
  40 import org.openecomp.core.converter.datatypes.CsarFileTypes;
 
  41 import org.openecomp.core.converter.errors.SubstitutionMappingsConverterErrorBuilder;
 
  42 import org.openecomp.core.impl.services.ServiceTemplateReaderServiceImpl;
 
  43 import org.openecomp.core.utilities.file.FileContentHandler;
 
  44 import org.openecomp.core.utilities.orchestration.OnboardingTypesEnum;
 
  45 import org.openecomp.sdc.common.errors.CoreException;
 
  46 import org.openecomp.sdc.common.errors.ErrorCategory;
 
  47 import org.openecomp.sdc.common.errors.ErrorCode;
 
  48 import org.openecomp.sdc.tosca.datatypes.ToscaServiceModel;
 
  49 import org.openecomp.sdc.tosca.datatypes.model.ArtifactDefinition;
 
  50 import org.openecomp.sdc.tosca.datatypes.model.CapabilityAssignment;
 
  51 import org.openecomp.sdc.tosca.datatypes.model.Import;
 
  52 import org.openecomp.sdc.tosca.datatypes.model.InterfaceDefinition;
 
  53 import org.openecomp.sdc.tosca.datatypes.model.NodeFilter;
 
  54 import org.openecomp.sdc.tosca.datatypes.model.NodeTemplate;
 
  55 import org.openecomp.sdc.tosca.datatypes.model.NodeType;
 
  56 import org.openecomp.sdc.tosca.datatypes.model.ParameterDefinition;
 
  57 import org.openecomp.sdc.tosca.datatypes.model.RequirementAssignment;
 
  58 import org.openecomp.sdc.tosca.datatypes.model.ServiceTemplate;
 
  59 import org.openecomp.sdc.tosca.datatypes.model.SubstitutionMapping;
 
  60 import org.openecomp.sdc.tosca.services.DataModelUtil;
 
  61 import org.openecomp.sdc.tosca.services.ToscaUtil;
 
  62 import org.openecomp.sdc.translator.services.heattotosca.globaltypes.GlobalTypesGenerator;
 
  63 import org.yaml.snakeyaml.error.YAMLException;
 
  65 import java.io.ByteArrayInputStream;
 
  67 import java.io.IOException;
 
  68 import java.util.ArrayList;
 
  69 import java.util.Collection;
 
  70 import java.util.HashMap;
 
  71 import java.util.List;
 
  73 import java.util.Objects;
 
  74 import java.util.Optional;
 
  75 import java.util.jar.Manifest;
 
  76 import java.util.regex.Pattern;
 
  78 public class ToscaConverterImpl implements ToscaConverter {
 
  80     public ToscaConverterImpl() {
 
  85     public ToscaServiceModel convert(FileContentHandler fileContentHandler)
 
  87         Map<String, byte[]> csarFiles = new HashMap<>(fileContentHandler.getFiles());
 
  88         ToscaServiceModel toscaServiceModel = new ToscaServiceModel();
 
  89         Map<String, ServiceTemplate> serviceTemplates = new HashMap<>();
 
  90         FileContentHandler artifacts = new FileContentHandler();
 
  91         GlobalSubstitutionServiceTemplate gsst = new GlobalSubstitutionServiceTemplate();
 
  92         for (Map.Entry<String, byte[]> fileEntry : csarFiles.entrySet()) {
 
  93             CsarFileTypes fileType = getFileType(fileEntry.getKey());
 
  95                 case mainServiceTemplate:
 
  96                     handleServiceTemplate(mainStName, fileEntry.getKey(), csarFiles, serviceTemplates);
 
  99                 case globalServiceTemplate:
 
 100                     handleServiceTemplate(globalStName, fileEntry.getKey(), csarFiles, serviceTemplates);
 
 105                         getConcreteArtifactFileName(fileEntry.getKey()), fileEntry.getValue());
 
 108                 case definitionsFile:
 
 109                     handleDefintionTemplate(fileEntry.getKey(), csarFiles, gsst);
 
 113         handleMetadataFile(csarFiles);
 
 114         updateToscaServiceModel(toscaServiceModel, serviceTemplates, artifacts, gsst, csarFiles);
 
 115         return toscaServiceModel;
 
 118     private void handleMetadataFile(Map<String, byte[]> csarFiles) {
 
 119         byte[] bytes = csarFiles.remove(metadataFile);
 
 121             csarFiles.put(metadataFile + ".original", bytes);
 
 125     private void handleDefintionTemplate(String key, Map<String, byte[]> csarFiles,
 
 126                                          GlobalSubstitutionServiceTemplate gsst) {
 
 128             ServiceTemplateReaderService readerService = new ServiceTemplateReaderServiceImpl(csarFiles.get(key));
 
 129             Object nodeTypes = readerService.getNodeTypes();
 
 130             if (nodeTypes instanceof Map) {
 
 131                 Map<String, NodeType> nodeTypeMap = (Map<String, NodeType>) nodeTypes;
 
 132                 gsst.appendNodes(nodeTypeMap);
 
 134         } catch (YAMLException ye) {
 
 135             throw new CoreException(new ErrorCode.ErrorCodeBuilder()
 
 136                 .withMessage("Invalid YAML content in file " + key)
 
 137                 .withCategory(ErrorCategory.APPLICATION).build(), ye);
 
 141     private String getConcreteArtifactFileName(String fileName){
 
 142         int artifactIndex = fileName.indexOf(CsarFileTypes.Artifacts.name());
 
 143         if(artifactIndex < 0){
 
 147         int artifactDirectoryIndex =
 
 148             artifactIndex + CsarFileTypes.Artifacts.name().length() + 1;
 
 149         return fileName.substring(artifactDirectoryIndex);
 
 152     private void updateToscaServiceModel(ToscaServiceModel toscaServiceModel,
 
 153                                          Map<String, ServiceTemplate> serviceTemplates,
 
 154                                          FileContentHandler externalFilesHandler,
 
 155                                          GlobalSubstitutionServiceTemplate globalSubstitutionServiceTemplate,
 
 156                                          Map<String, byte[]> csarFiles) {
 
 157         Collection<ServiceTemplate> globalServiceTemplates =
 
 158             GlobalTypesGenerator.getGlobalTypesServiceTemplate(OnboardingTypesEnum.CSAR).values();
 
 159         addGlobalServiceTemplates(globalServiceTemplates, serviceTemplates);
 
 160         toscaServiceModel.setEntryDefinitionServiceTemplate(mainStName);
 
 161         toscaServiceModel.setServiceTemplates(serviceTemplates);
 
 162         externalFilesHandler.addFile(metadataFile + ".original",
 
 163             csarFiles.get(metadataFile + ".original"));
 
 164         toscaServiceModel.setArtifactFiles(externalFilesHandler);
 
 166         if(MapUtils.isNotEmpty(globalSubstitutionServiceTemplate.getNode_types())) {
 
 168                 .put(GLOBAL_SUBSTITUTION_SERVICE_FILE_NAME, globalSubstitutionServiceTemplate);
 
 172     private void addGlobalServiceTemplates(Collection<ServiceTemplate> globalServiceTemplates,
 
 173                                            Map<String, ServiceTemplate> serviceTemplates) {
 
 174         for (ServiceTemplate serviceTemplate : globalServiceTemplates) {
 
 175             serviceTemplates.put(ToscaUtil.getServiceTemplateFileName(serviceTemplate), serviceTemplate);
 
 179     private void handleServiceTemplate(String serviceTemplateName,
 
 180                                        String fileName, Map<String, byte[]> csarFiles,
 
 181                                        Map<String, ServiceTemplate> serviceTemplates) {
 
 182         Optional<ServiceTemplate> serviceTemplate =
 
 183             getServiceTemplateFromCsar(fileName, csarFiles);
 
 184         serviceTemplate.ifPresent(
 
 185             serviceTemplateValue -> addServiceTemplate(serviceTemplateName, serviceTemplateValue,
 
 189     private void addServiceTemplate(String serviceTemplateName,
 
 190                                     ServiceTemplate serviceTemplate,
 
 191                                     Map<String, ServiceTemplate> serviceTemplates) {
 
 192         serviceTemplates.put(serviceTemplateName, serviceTemplate);
 
 195     private Optional<byte[]> getManifestContent(Map<String, byte[]> csarFiles) {
 
 196         for (Map.Entry<String, byte[]> csarFileEntry : csarFiles.entrySet()) {
 
 197             if (csarFileEntry.getKey().contains(manifestFileName)) {
 
 198                 return Optional.of(csarFileEntry.getValue());
 
 202         return Optional.empty();
 
 205     private Optional<ServiceTemplate> getServiceTemplateFromCsar(String fileName,
 
 206                                                                  Map<String, byte[]> csarFiles) {
 
 207         byte[] fileContent = csarFiles.get(fileName);
 
 208         ServiceTemplate serviceTemplate = convertServiceTemplate(fileName, fileContent);
 
 210         return Optional.of(serviceTemplate);
 
 213     private ServiceTemplate convertServiceTemplate(String serviceTemplateName,
 
 214                                                    byte[] fileContent) {
 
 215         ServiceTemplate serviceTemplate = new ServiceTemplate();
 
 217             ServiceTemplateReaderService readerService =
 
 218                 new ServiceTemplateReaderServiceImpl(fileContent);
 
 219             convertMetadata(serviceTemplateName, serviceTemplate, readerService);
 
 220             convertToscaVersion(serviceTemplate, readerService);
 
 221             convertImports(serviceTemplate);
 
 222             convertNodeTypes(serviceTemplate, readerService);
 
 223             convertTopologyTemplate(serviceTemplate, readerService);
 
 225         } catch (YAMLException ye) {
 
 226             throw new CoreException(new ErrorCode.ErrorCodeBuilder()
 
 227                 .withMessage("Invalid YAML content in file" + serviceTemplateName)
 
 228                 .withCategory(ErrorCategory.APPLICATION).build(), ye);
 
 232         return serviceTemplate;
 
 235     private void convertToscaVersion(ServiceTemplate serviceTemplate,
 
 236                                      ServiceTemplateReaderService readerService) {
 
 237         Object toscaVersion = readerService.getToscaVersion();
 
 238         serviceTemplate.setTosca_definitions_version((String) toscaVersion);
 
 241     private void convertImports(ServiceTemplate serviceTemplate) {
 
 242         serviceTemplate.setImports(new ArrayList<>());
 
 243         serviceTemplate.getImports()
 
 244             .add(createImportMap(openecompHeatIndex, HEAT_INDEX_IMPORT_FILE));
 
 245         serviceTemplate.getImports().add(createImportMap(ONAP_INDEX, ONAP_INDEX_IMPORT_FILE));
 
 246         serviceTemplate.getImports().add(createImportMap(globalSubstitution, globalStName));
 
 250     private Map<String, Import> createImportMap(String key, String fileName) {
 
 251         Map<String, Import> importMap = new HashMap<>();
 
 252         Import anImport = new Import();
 
 253         anImport.setFile(fileName);
 
 254         importMap.put(key, anImport);
 
 259     private void convertMetadata(String serviceTemplateName,
 
 260                                  ServiceTemplate serviceTemplate,
 
 261                                  ServiceTemplateReaderService readerService) {
 
 262         Map<String, Object> metadataToConvert = (Map<String, Object>) readerService.getMetadata();
 
 263         Map<String, String> finalMetadata = new HashMap<>();
 
 265         if (MapUtils.isNotEmpty(metadataToConvert)) {
 
 266             for (Map.Entry<String, Object> metadataEntry : metadataToConvert.entrySet()) {
 
 267                 if (Objects.isNull(metadataEntry.getValue()) ||
 
 268                     !(metadataEntry.getValue() instanceof String)) {
 
 271                 finalMetadata.put(metadataEntry.getKey(), (String) metadataEntry.getValue());
 
 275         finalMetadata.put("template_name", getTemplateNameFromStName(serviceTemplateName));
 
 276         serviceTemplate.setMetadata(finalMetadata);
 
 279     private void convertNodeTypes(ServiceTemplate serviceTemplate, ServiceTemplateReaderService readerService) {
 
 280         Map<String, Object> nodeTypes = (Map<String, Object>) readerService.getNodeTypes();
 
 281         if (MapUtils.isEmpty(nodeTypes)) {
 
 285         for (Map.Entry<String, Object> nodeTypeEntry : nodeTypes.entrySet()) {
 
 286             Optional<NodeType> nodeType = ToscaConverterUtil
 
 287                 .createObjectFromClass(nodeTypeEntry.getKey(), nodeTypeEntry.getValue(),
 
 290             nodeType.ifPresent(nodeTypeValue -> DataModelUtil
 
 291                 .addNodeType(serviceTemplate, nodeTypeEntry.getKey(), nodeTypeValue));
 
 295     private void convertTopologyTemplate(ServiceTemplate serviceTemplate,
 
 296                                          ServiceTemplateReaderService readerService) {
 
 298         convertInputs(serviceTemplate, readerService);
 
 299         convertNodeTemplates(serviceTemplate, readerService);
 
 300         convertOutputs(serviceTemplate, readerService);
 
 301         convertSubstitutionMappings(serviceTemplate, readerService);
 
 304     private void convertInputs(ServiceTemplate serviceTemplate,
 
 305                                ServiceTemplateReaderService readerService) {
 
 306         Map<String, Object> inputs = readerService.getInputs();
 
 307         addInputsOrOutputsToServiceTemplate(serviceTemplate, inputs, Constants.inputs);
 
 310     private void convertOutputs(ServiceTemplate serviceTemplate,
 
 311                                 ServiceTemplateReaderService readerService) {
 
 312         Map<String, Object> outputs = readerService.getOutputs();
 
 313         addInputsOrOutputsToServiceTemplate(serviceTemplate, outputs, Constants.outputs);
 
 316     private void addInputsOrOutputsToServiceTemplate(ServiceTemplate serviceTemplate,
 
 317                                                      Map<String, Object> mapToConvert,
 
 318                                                      String inputsOrOutputs) {
 
 319         if (MapUtils.isEmpty(mapToConvert)) {
 
 323         for (Map.Entry<String, Object> entry : mapToConvert.entrySet()) {
 
 324             Optional<ParameterDefinition> parameterDefinition =
 
 325                 ToscaConverterUtil.createObjectFromClass(
 
 326                     entry.getKey(), entry.getValue(), ParameterDefinition.class);
 
 328             parameterDefinition.ifPresent(parameterDefinitionValue -> {
 
 329                 Optional<Object> defaultValue =
 
 330                     ToscaConverterUtil.getDefaultValue(entry.getValue(), parameterDefinition.get());
 
 331                 defaultValue.ifPresent(parameterDefinitionValue::set_default);
 
 332                 addToServiceTemplateAccordingToSection(
 
 333                     serviceTemplate, inputsOrOutputs, entry.getKey(), parameterDefinition.get());
 
 338     private void addToServiceTemplateAccordingToSection(ServiceTemplate serviceTemplate,
 
 339                                                         String inputsOrOutputs,
 
 341                                                         ParameterDefinition parameterDefinition) {
 
 342         switch (inputsOrOutputs) {
 
 345                     .addInputParameterToTopologyTemplate(serviceTemplate, parameterId, parameterDefinition);
 
 349                     .addOutputParameterToTopologyTemplate(serviceTemplate, parameterId, parameterDefinition);
 
 353     private void convertNodeTemplates(ServiceTemplate serviceTemplate,
 
 354                                       ServiceTemplateReaderService readerService) {
 
 355         Map<String, Object> nodeTemplates = readerService.getNodeTemplates();
 
 356         if (MapUtils.isEmpty(nodeTemplates)) {
 
 360         for (Map.Entry<String, Object> nodeTemplateEntry : nodeTemplates.entrySet()) {
 
 361             NodeTemplate nodeTemplate = convertNodeTemplate(nodeTemplateEntry.getValue());
 
 362             DataModelUtil.addNodeTemplate(serviceTemplate, nodeTemplateEntry.getKey(), nodeTemplate);
 
 366     private void convertSubstitutionMappings(ServiceTemplate serviceTemplate,
 
 367                                              ServiceTemplateReaderService readerService) {
 
 368         Map<String, Object> substitutionMappings = readerService.getSubstitutionMappings();
 
 369         if (MapUtils.isEmpty(substitutionMappings)) {
 
 372         SubstitutionMapping substitutionMapping = convertSubstitutionMappings(substitutionMappings);
 
 373         DataModelUtil.addSubstitutionMapping(serviceTemplate, substitutionMapping);
 
 376     private SubstitutionMapping convertSubstitutionMappings(Map<String, Object> substitutionMappings) {
 
 377         SubstitutionMapping substitutionMapping = new SubstitutionMapping();
 
 379         substitutionMapping.setNode_type((String) substitutionMappings.get(nodeType));
 
 380         substitutionMapping.setCapabilities(
 
 381             convertSubstitutionMappingsSections(capabilities, substitutionMappings.get(capabilities)));
 
 382         substitutionMapping.setRequirements(
 
 383             convertSubstitutionMappingsSections(requirements, substitutionMappings.get(requirements)));
 
 385         return substitutionMapping;
 
 388     private Map<String, List<String>> convertSubstitutionMappingsSections(String sectionName,
 
 389                                                                           Object sectionToConvert) {
 
 391         if(Objects.isNull(sectionToConvert)){
 
 395         if(!(sectionToConvert instanceof Map)) {
 
 396             throw new CoreException(
 
 397                 new SubstitutionMappingsConverterErrorBuilder(
 
 398                     sectionName, sectionToConvert.getClass().getSimpleName()).build());
 
 401         return convertSection(sectionToConvert);
 
 404     private Map<String, List<String>> convertSection(Object sectionToConvert) {
 
 406         Map<String, Object> sectionAsMap = (Map<String, Object>)sectionToConvert;
 
 407         Map<String, List<String>> convertedSection = new HashMap<>();
 
 409         if (MapUtils.isEmpty(sectionAsMap)) {
 
 413         for (Map.Entry<String, Object> entry : sectionAsMap.entrySet()) {
 
 414             if (entry.getValue() instanceof List) {
 
 415                 convertedSection.put(entry.getKey(), (List<String>) entry.getValue());
 
 419         return convertedSection;
 
 422     private CsarFileTypes getFileType(String fileName) {
 
 423         if (isMainServiceTemplate(fileName)) {
 
 424             return CsarFileTypes.mainServiceTemplate;
 
 425         } else if (isGlobalServiceTemplate(fileName)) {
 
 426             return CsarFileTypes.globalServiceTemplate;
 
 427         } else if (isDefinitions(fileName)) {
 
 428             return CsarFileTypes.definitionsFile;
 
 429         } else if (isMetadataFile(fileName)) {
 
 430             return CsarFileTypes.toscaMetadata;
 
 432         return CsarFileTypes.externalFile;
 
 435     private Optional<Manifest> getCsarManifest(Map<String, byte[]> csarFiles) throws IOException {
 
 436         Optional<byte[]> manifestContent = getManifestContent(csarFiles);
 
 438         if (manifestContent.isPresent()) {
 
 439             ByteArrayInputStream byteInputStream = new ByteArrayInputStream(manifestContent.get());
 
 441             return Optional.of(new Manifest(byteInputStream));
 
 444         return Optional.empty();
 
 447     private NodeTemplate convertNodeTemplate(Object candidateNodeTemplate) {
 
 448         NodeTemplate nodeTemplate = new NodeTemplate();
 
 450         Map<String, Object> nodeTemplateAsMap = (Map<String, Object>) candidateNodeTemplate;
 
 451         nodeTemplate.setArtifacts((Map<String, ArtifactDefinition>) nodeTemplateAsMap.get("artifacts"));
 
 452         nodeTemplate.setAttributes((Map<String, Object>) nodeTemplateAsMap.get("attributes"));
 
 453         nodeTemplate.setCopy((String) nodeTemplateAsMap.get("copy"));
 
 454         nodeTemplate.setDescription((String) nodeTemplateAsMap.get("description"));
 
 455         nodeTemplate.setDirectives((List<String>) nodeTemplateAsMap.get("directives"));
 
 456         nodeTemplate.setInterfaces(
 
 457             (Map<String, InterfaceDefinition>) nodeTemplateAsMap.get("interfaces"));
 
 458         nodeTemplate.setNode_filter((NodeFilter) nodeTemplateAsMap.get("node_filter"));
 
 459         nodeTemplate.setProperties((Map<String, Object>) nodeTemplateAsMap.get("properties"));
 
 460         nodeTemplate.setRequirements(
 
 461             (List<Map<String, RequirementAssignment>>) nodeTemplateAsMap.get("requirements"));
 
 462         nodeTemplate.setType((String) nodeTemplateAsMap.get("type"));
 
 463         nodeTemplate.setCapabilities(
 
 464             convertCapabilities((Map<String, Object>) nodeTemplateAsMap.get("capabilities")));
 
 469     private List<Map<String, CapabilityAssignment>> convertCapabilities(Map<String, Object> capabilities) {
 
 470         List<Map<String, CapabilityAssignment>> convertedCapabilities = new ArrayList<>();
 
 471         if (MapUtils.isEmpty(capabilities)) {
 
 474         for (Map.Entry<String, Object> capabilityAssignmentEntry : capabilities.entrySet()) {
 
 475             Map<String, CapabilityAssignment> tempMap = new HashMap<>();
 
 476             Optional<CapabilityAssignment> capabilityAssignment = ToscaConverterUtil.createObjectFromClass
 
 477                 (capabilityAssignmentEntry.getKey(), capabilityAssignmentEntry.getValue(),
 
 478                     CapabilityAssignment.class);
 
 480             capabilityAssignment.ifPresent(capabilityAssignmentValue -> {
 
 481                 tempMap.put(capabilityAssignmentEntry.getKey(), capabilityAssignmentValue);
 
 482                 convertedCapabilities.add(tempMap);
 
 487         return convertedCapabilities;
 
 491     private boolean isMainServiceTemplate(String fileName) {
 
 492         return fileName.endsWith(mainStName);
 
 495     private boolean isMetadataFile(String fileName) {
 
 496         return fileName.equals(metadataFile);
 
 499     private boolean isGlobalServiceTemplate(String fileName) {
 
 500         return fileName.endsWith(globalStName);
 
 503     private boolean isDefinitions(String fileName) {
 
 504         return fileName.startsWith(definitionsDir);
 
 507     private String getTemplateNameFromStName(String serviceTemplateName) {
 
 508         String fileNameWithoutDirectories;
 
 509         fileNameWithoutDirectories = getFileNameWithoutDirectories(serviceTemplateName);
 
 510         return fileNameWithoutDirectories.split("ServiceTemplate")[0];
 
 513     private String getFileNameWithoutDirectories(String serviceTemplateName) {
 
 514         String fileNameWithoutDirectories;
 
 515         if (serviceTemplateName.contains("/")) {
 
 516             String[] split = serviceTemplateName.split("/");
 
 517             fileNameWithoutDirectories = split[split.length - 1];
 
 518         } else if (serviceTemplateName.contains(File.separator)) {
 
 519             String[] split = serviceTemplateName.split(Pattern.quote(File.separator));
 
 520             fileNameWithoutDirectories = split[split.length - 1];
 
 522             fileNameWithoutDirectories = serviceTemplateName;
 
 524         return fileNameWithoutDirectories;