/* * Copyright 2013 Red Hat, Inc. and/or its affiliates. * * 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 org.kie.workbench.common.services.backend.validation; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.stream.Collectors; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.inject.Instance; import javax.inject.Inject; import org.drools.core.base.evaluators.TimeIntervalParser; import org.guvnor.common.services.project.model.POM; import org.guvnor.common.services.shared.validation.model.ValidationMessage; import org.jboss.errai.bus.server.annotations.Service; import org.kie.workbench.common.services.shared.validation.CopyValidator; import org.kie.workbench.common.services.shared.validation.DeleteValidator; import org.kie.workbench.common.services.shared.validation.SaveValidator; import org.kie.workbench.common.services.shared.validation.ValidationService; import org.uberfire.backend.vfs.Path; import org.uberfire.commons.validation.PortablePreconditions; import org.uberfire.ext.editor.commons.backend.validation.ValidationUtils; /** * Implementation of validation Service for file names */ @Service @ApplicationScoped public class ValidationServiceImpl implements ValidationService { private org.uberfire.ext.editor.commons.service.ValidationService validationService; private PackageNameValidator packageNameValidator; private ProjectNameValidator projectNameValidator; private JavaFileNameValidator javaFileNameValidator; private Collection<SaveValidator> saveValidators = new ArrayList<>(); private Collection<CopyValidator> copyValidators = new ArrayList<>(); private Collection<DeleteValidator> deleteValidators = new ArrayList<>(); public ValidationServiceImpl() { } @Inject public ValidationServiceImpl( final org.uberfire.ext.editor.commons.service.ValidationService validationService, final PackageNameValidator packageNameValidator, final ProjectNameValidator projectNameValidator, final JavaFileNameValidator javaFileNameValidator, final Instance<SaveValidator<?>> saveValidatorInstance, final Instance<CopyValidator<?>> copyValidatorInstance, final Instance<DeleteValidator<?>> deleteValidatorInstance ) { this.validationService = validationService; this.packageNameValidator = packageNameValidator; this.projectNameValidator = projectNameValidator; this.javaFileNameValidator = javaFileNameValidator; saveValidatorInstance.forEach( saveValidators::add ); copyValidatorInstance.forEach( copyValidators::add ); deleteValidatorInstance.forEach( deleteValidators::add ); } @Override public boolean isProjectNameValid( final String projectName ) { return projectNameValidator.isValid( projectName ); } @Override public boolean isPackageNameValid( final String packageName ) { return packageNameValidator.isValid( packageName ); } @Override public boolean isFileNameValid( final Path path, final String fileName ) { return validationService.isFileNameValid( path, fileName ); } public boolean isJavaFileNameValid( final String fileName ) { return javaFileNameValidator.isValid( fileName ); } @Override public boolean isFileNameValid( String fileName ) { return validationService.isFileNameValid( fileName ); } @Override public Map<String, Boolean> evaluateJavaIdentifiers( String[] identifiers ) { Map<String, Boolean> result = new HashMap<String, Boolean>( identifiers.length ); if ( identifiers != null && identifiers.length > 0 ) { for ( String s : identifiers ) { result.put( s, ValidationUtils.isJavaIdentifier( s ) ); } } return result; } @Override public Map<String, Boolean> evaluateMavenIdentifiers( String[] identifiers ) { Map<String, Boolean> result = new HashMap<String, Boolean>( identifiers.length ); if ( identifiers != null && identifiers.length > 0 ) { for ( String s : identifiers ) { result.put( s, ValidationUtils.isArtifactIdentifier( s ) ); } } return result; } @Override public boolean isTimerIntervalValid( final String timerInterval ) { try { TimeIntervalParser.parse( timerInterval ); return true; } catch ( RuntimeException e ) { return false; } } @Override public boolean validate( final POM pom ) { PortablePreconditions.checkNotNull( "pom", pom ); final String name = pom.getName(); final String groupId = pom.getGav().getGroupId(); final String artifactId = pom.getGav().getArtifactId(); final String version = pom.getGav().getVersion(); final boolean validName = !(name == null || name.isEmpty()) && isProjectNameValid( name ); final boolean validGroupId = validateGroupId( groupId ); final boolean validArtifactId = validateArtifactId( artifactId ); final boolean validVersion = validateGAVVersion( version ); return validName && validGroupId && validArtifactId && validVersion; } @Override public boolean validateGroupId( final String groupId ) { //See org.apache.maven.model.validation.DefaultModelValidator. Both GroupID and ArtifactID are checked against "[A-Za-z0-9_\\-.]+" final String[] groupIdComponents = (groupId == null ? new String[]{} : groupId.split( "\\.", -1 )); final boolean validGroupId = !(groupIdComponents.length == 0 || evaluateMavenIdentifiers( groupIdComponents ).containsValue( Boolean.FALSE )); return validGroupId; } @Override public boolean validateArtifactId( final String artifactId ) { //See org.apache.maven.model.validation.DefaultModelValidator. Both GroupID and ArtifactID are checked against "[A-Za-z0-9_\\-.]+" final String[] artifactIdComponents = (artifactId == null ? new String[]{} : artifactId.split( "\\.", -1 )); final boolean validArtifactId = !(artifactIdComponents.length == 0 || evaluateMavenIdentifiers( artifactIdComponents ).containsValue( Boolean.FALSE )); return validArtifactId; } @Override public boolean validateGAVVersion( final String version ) { final boolean validVersion = !(version == null || version.isEmpty() || !version.matches( "^[a-zA-Z0-9\\.\\-_]+$" )); return validVersion; } @Override public <T> Collection<ValidationMessage> validateForSave( final Path path, final T content ) { return (Collection<ValidationMessage>) saveValidators.stream().filter( v -> v.accept( path ) ).flatMap( c -> c.validate( path, content ).stream() ).collect( Collectors.toList() ); } @Override public <T> Collection<ValidationMessage> validateForCopy( final Path path, final T content ) { return (Collection<ValidationMessage>) copyValidators.stream().filter( v -> v.accept( path ) ).flatMap( c -> c.validate( path, content ).stream() ).collect( Collectors.toList() ); } @Override public Collection<ValidationMessage> validateForCopy( final Path path ) { return (Collection<ValidationMessage>) copyValidators.stream().filter( v -> v.accept( path ) ).flatMap( c -> c.validate( path ).stream() ).collect( Collectors.toList() ); } @Override public <T> Collection<ValidationMessage> validateForDelete( final Path path, final T content ) { return (Collection<ValidationMessage>) deleteValidators.stream().filter( v -> v.accept( path ) ).flatMap( c -> c.validate( path, content ).stream() ).collect( Collectors.toList() ); } @Override public Collection<ValidationMessage> validateForDelete( final Path path ) { return (Collection<ValidationMessage>) deleteValidators.stream().filter( v -> v.accept( path ) ).flatMap( c -> c.validate( path ).stream() ).collect( Collectors.toList() ); } }