/*******************************************************************************
* (c) Copyright 2016 Hewlett-Packard Development Company, L.P.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Apache License v2.0 which accompany this distribution.
*
* The Apache License is available at
* http://www.apache.org/licenses/LICENSE-2.0
*
*******************************************************************************/
package io.cloudslang.lang.compiler;
import io.cloudslang.lang.compiler.modeller.MetadataModeller;
import io.cloudslang.lang.compiler.modeller.model.Metadata;
import io.cloudslang.lang.compiler.modeller.result.MetadataModellingResult;
import io.cloudslang.lang.compiler.parser.MetadataParser;
import io.cloudslang.lang.compiler.parser.model.ParsedDescriptionData;
import io.cloudslang.lang.compiler.parser.utils.MetadataValidator;
import java.util.List;
import org.apache.commons.lang.Validate;
public class MetadataExtractorImpl implements MetadataExtractor {
private MetadataModeller metadataModeller;
private MetadataParser metadataParser;
private MetadataValidator metadataValidator;
@Override
public Metadata extractMetadata(SlangSource source) {
validateSlangSource(source);
return getExecutableMetadata(source);
}
@Deprecated
@Override
public Metadata extractMetadata(SlangSource source, boolean shouldValidateDescription) {
return getMetadata(source, shouldValidateDescription);
}
@Override
public MetadataModellingResult extractMetadataModellingResult(SlangSource source) {
validateSlangSource(source);
ParsedDescriptionData parsedDescriptionData = metadataParser.parse(source);
return metadataModeller.createModel(parsedDescriptionData);
}
@Deprecated
@Override
public MetadataModellingResult extractMetadataModellingResult(
SlangSource source,
boolean shouldValidateCheckstyle) {
MetadataModellingResult metadataModellingResult = extractMetadataModellingResult(source);
if (shouldValidateCheckstyle) {
metadataModellingResult.getErrors().addAll(validateCheckstyle(source));
}
return metadataModellingResult;
}
@Override
public List<RuntimeException> validateCheckstyle(SlangSource source) {
validateSlangSource(source);
return metadataValidator.validateCheckstyle(source);
}
private Metadata getMetadata(SlangSource source, boolean shouldValidateDescription) {
MetadataModellingResult result = extractMetadataModellingResult(source);
if (result.getErrors().size() > 0) {
throw result.getErrors().get(0);
}
if (shouldValidateDescription) {
List<RuntimeException> checkstyleErrors = validateCheckstyle(source);
if (checkstyleErrors.size() > 0) {
throw checkstyleErrors.get(0);
}
}
return result.getMetadata();
}
private void validateSlangSource(SlangSource source) {
Validate.notNull(source, "You must supply a source to extract the metadata from");
}
private Metadata getExecutableMetadata(SlangSource source) {
MetadataModellingResult result = getMetadataModellingResultThrowFirstError(source);
return result.getMetadata();
}
private MetadataModellingResult getMetadataModellingResultThrowFirstError(SlangSource source) {
MetadataModellingResult result = extractMetadataModellingResult(source);
if (result.getErrors().size() > 0) {
throw result.getErrors().get(0);
}
return result;
}
public void setMetadataModeller(MetadataModeller metadataModeller) {
this.metadataModeller = metadataModeller;
}
public void setMetadataParser(MetadataParser metadataParser) {
this.metadataParser = metadataParser;
}
public void setMetadataValidator(MetadataValidator metadataValidator) {
this.metadataValidator = metadataValidator;
}
}