/* * Copyright 2015 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; import javax.enterprise.context.ApplicationScoped; import javax.enterprise.event.Observes; import javax.inject.Inject; import javax.inject.Named; import javax.persistence.Entity; import org.kie.workbench.common.screens.datamodeller.events.DataObjectCreatedEvent; import org.kie.workbench.common.screens.datamodeller.events.DataObjectDeletedEvent; 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.service.PersistenceDescriptorService; import org.kie.workbench.common.services.datamodeller.core.DataObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.uberfire.backend.server.util.Paths; import org.uberfire.backend.vfs.Path; import org.uberfire.io.IOService; @ApplicationScoped public class DataModelerEventObserver { private static final Logger logger = LoggerFactory.getLogger( DataModelerEventObserver.class ); private PersistenceDescriptorService descriptorService; private IOService ioService; public DataModelerEventObserver() { } @Inject public DataModelerEventObserver( final PersistenceDescriptorService descriptorService, final @Named( "ioStrategy" ) IOService ioService ) { this.descriptorService = descriptorService; this.ioService = ioService; } public void onDataObjectCreated( @Observes DataObjectCreatedEvent event ) { Path descriptorPath; PersistenceDescriptorModel persistenceDescriptor; if ( isPersistable( event.getCurrentDataObject() ) ) { descriptorPath = descriptorService.calculatePersistenceDescriptorPath( event.getCurrentProject() ); persistenceDescriptor = safeLoad( descriptorPath ); if ( persistenceDescriptor != null && !containsClass( persistenceDescriptor.getPersistenceUnit(), event.getCurrentDataObject().getClassName() ) ) { persistenceDescriptor.getPersistenceUnit().getClasses().add( event.getCurrentDataObject().getClassName() ); descriptorService.save( descriptorPath, persistenceDescriptor, null, "Entity added to persistence descriptor" ); } } } public void onDataObjectDeleted( @Observes DataObjectDeletedEvent event ) { Path descriptorPath; PersistenceDescriptorModel persistenceDescriptor; descriptorPath = descriptorService.calculatePersistenceDescriptorPath( event.getCurrentProject() ); persistenceDescriptor = safeLoad( descriptorPath ); if ( persistenceDescriptor != null && containsClass( persistenceDescriptor.getPersistenceUnit(), event.getCurrentDataObject().getClassName() ) ) { persistenceDescriptor.getPersistenceUnit().getClasses().remove( event.getCurrentDataObject().getClassName() ); descriptorService.save( descriptorPath, persistenceDescriptor, null, "Entity removed from persistence descriptor" ); } } private boolean containsClass( PersistenceUnitModel persistenceUnit, String className ) { return persistenceUnit != null && persistenceUnit.getClasses() != null && persistenceUnit.getClasses().contains( className ); } private PersistenceDescriptorModel safeLoad( final Path path ) { try { if ( path != null && ioService.exists( Paths.convert( path ) ) ) { return descriptorService.load( path ); } } catch ( Exception e ) { logger.warn( "It was not possible to read persistence descriptor por project: " + path ); } return null; } private boolean isPersistable( DataObject dataObject ) { return dataObject != null && dataObject.getAnnotation( Entity.class.getName() ) != null; } }