/* * Copyright 2017 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.screens.datamodeller.backend.server.validation; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Optional; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; import org.guvnor.common.services.shared.validation.model.ValidationMessage; import org.kie.workbench.common.screens.datamodeller.model.persistence.PersistenceDescriptorModel; import org.kie.workbench.common.screens.datamodeller.model.persistence.PersistenceUnitModel; import org.kie.workbench.common.screens.datamodeller.model.persistence.TransactionType; import org.kie.workbench.common.screens.datamodeller.validation.PersistenceDescriptorValidator; import org.kie.workbench.common.services.backend.project.ProjectClassLoaderHelper; import org.kie.workbench.common.services.shared.project.KieProject; import org.kie.workbench.common.services.shared.project.KieProjectService; import org.uberfire.backend.vfs.Path; import static org.kie.workbench.common.screens.datamodeller.backend.server.validation.PersistenceDescriptorValidationMessages.newErrorMessage; @ApplicationScoped public class PersistenceDescriptorValidatorImpl implements PersistenceDescriptorValidator { private KieProjectService projectService; private ProjectClassLoaderHelper projectClassLoaderHelper; private PersistableClassValidator classValidator = new PersistableClassValidator( ); private PropertyValidator propertyValidator = new PropertyValidator( ); public PersistenceDescriptorValidatorImpl( ) { //Empty constructor for Weld proxying } @Inject public PersistenceDescriptorValidatorImpl( KieProjectService projectService, ProjectClassLoaderHelper projectClassLoaderHelper ) { this.projectService = projectService; this.projectClassLoaderHelper = projectClassLoaderHelper; } @Override public List< ValidationMessage > validate( Path path, PersistenceDescriptorModel model ) { final List< ValidationMessage > messages = new ArrayList< ValidationMessage >( ); final KieProject project = projectService.resolveProject( path ); if ( project == null ) { //uncommon scenario, since by construction, the same as with other wb assets, a persistence descriptor // belongs to a project messages.add( newErrorMessage( PersistenceDescriptorValidationMessages.DESCRIPTOR_NOT_BELONG_TO_PROJECT_ID, PersistenceDescriptorValidationMessages.DESCRIPTOR_NOT_BELONG_TO_PROJECT ) ); return messages; } if ( model.getPersistenceUnit( ) == null ) { messages.add( newErrorMessage( PersistenceDescriptorValidationMessages.PERSISTENCE_UNIT_NOT_FOUND_ID, PersistenceDescriptorValidationMessages.PERSISTENCE_UNIT_NOT_FOUND ) ); return messages; } final PersistenceUnitModel unitModel = model.getPersistenceUnit(); if ( unitModel.getName( ) == null || unitModel.getName( ).trim( ).isEmpty( ) ) { messages.add( newErrorMessage( PersistenceDescriptorValidationMessages.PERSISTENCE_UNIT_NAME_EMPTY_ID, PersistenceDescriptorValidationMessages.PERSISTENCE_UNIT_NAME_EMPTY ) ); } if ( unitModel.getProvider( ) == null || unitModel.getProvider( ).trim( ).isEmpty( ) ) { messages.add( newErrorMessage( PersistenceDescriptorValidationMessages.PERSISTENCE_UNIT_PROVIDER_ID, PersistenceDescriptorValidationMessages.PERSISTENCE_UNIT_PROVIDER_EMPTY ) ); } if ( unitModel.getTransactionType( ) == null ) { messages.add( newErrorMessage( PersistenceDescriptorValidationMessages.PERSISTENCE_UNIT_TRANSACTION_TYPE_EMPTY_ID, PersistenceDescriptorValidationMessages.PERSISTENCE_UNIT_TRANSACTION_TYPE_EMPTY ) ); } else if ( unitModel.getTransactionType( ) == TransactionType.JTA && ( unitModel.getJtaDataSource( ) == null || unitModel.getJtaDataSource( ).trim( ).isEmpty( ) ) ) { messages.add( newErrorMessage( PersistenceDescriptorValidationMessages.PERSISTENCE_UNIT_JTA_DATASOURCE_EMPTY_ID, PersistenceDescriptorValidationMessages.PERSISTENCE_UNIT_JTA_DATASOURCE_EMPTY ) ); } else if ( unitModel.getTransactionType( ) == TransactionType.RESOURCE_LOCAL && ( unitModel.getNonJtaDataSource( ) == null || unitModel.getNonJtaDataSource( ).trim( ).isEmpty( ) ) ) { messages.add( newErrorMessage( PersistenceDescriptorValidationMessages.PERSISTENCE_UNIT_NON_JTA_DATASOURCE_EMPTY_ID, PersistenceDescriptorValidationMessages.PERSISTENCE_UNIT_NON_JTA_DATASOURCE_EMPTY ) ); } if ( unitModel.getClasses( ) != null && !unitModel.getClasses( ).isEmpty( ) ) { ClassLoader projectClassLoader = projectClassLoaderHelper.getProjectClassLoader( project ); unitModel.getClasses( ).forEach( clazz -> Optional.ofNullable( classValidator.validate( clazz, projectClassLoader ) ).ifPresent( messages::addAll ) ); } if ( unitModel.getProperties( ) != null ) { int[] index = { 1 }; unitModel.getProperties( ).forEach( property -> messages.addAll( Optional.ofNullable( propertyValidator.validate( property.getName( ), property.getValue( ), index[ 0 ]++ ) ).orElse( Collections.emptyList( ) ) ) ); } return messages; } }