/** * Copyright (C) 2012 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.jbpm.formModeler.dataModeler.integration; import java.net.URI; import java.util.Locale; import java.util.Map; import java.util.ResourceBundle; import java.util.TreeMap; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; import javax.inject.Named; import org.drools.core.util.StringUtils; import org.jbpm.formModeler.api.model.DataHolder; import org.jbpm.formModeler.core.config.builders.dataHolder.DataHolderBuildConfig; import org.jbpm.formModeler.core.config.builders.dataHolder.PojoDataHolderBuilder; import org.jbpm.formModeler.core.config.builders.dataHolder.RangedDataHolderBuilder; import org.jbpm.formModeler.dataModeler.model.DataModelerDataHolder; import org.kie.api.builder.KieModule; import org.kie.scanner.KieModuleMetaData; import org.kie.workbench.common.services.backend.builder.service.BuildInfoService; import org.kie.workbench.common.services.datamodeller.core.DataModel; import org.kie.workbench.common.services.datamodeller.core.DataObject; import org.kie.workbench.common.services.shared.project.KieProject; import org.kie.workbench.common.services.shared.project.KieProjectService; 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 DataModelerService implements RangedDataHolderBuilder { public static final String HOLDER_TYPE_DATA_MODEL = "dataModelerEntry"; private Logger log = LoggerFactory.getLogger( DataModelerService.class ); @Inject protected org.kie.workbench.common.screens.datamodeller.service.DataModelerService dataModelerService; @Inject private BuildInfoService buildInfoService; @Inject protected KieProjectService projectService; @Inject @Named("ioStrategy") protected IOService ioService; @Override public Map<String, String> getHolderSources( String path ) { Map<String, String> result = new TreeMap<String, String>(); try { DataModel dataModel = dataModelerService.loadModel( projectService.resolveProject( getPath( path ) ) ); if ( dataModel != null && dataModel.getDataObjects() != null ) { String className = ""; for ( DataObject dataObject : dataModel.getDataObjects() ) { className = dataObject.getClassName(); result.put( className, className ); } } } catch ( Throwable e ) { result.put( "-", "-" ); } return result; } @Override public DataHolder buildDataHolder( DataHolderBuildConfig config ) { DataModelerDataHolder dataHolder = null; boolean isExternal = false; String path = config.getAttribute( "path" ); if ( StringUtils.isEmpty( path ) ) { dataHolder = new DataModelerDataHolder( config.getHolderId(), config.getInputId(), config.getOutputId(), config.getValue(), config.getRenderColor() ); isExternal = Boolean.TRUE.equals( config.getAttribute( "supportedType" ) ); } else { Class holderClass = findHolderClass( config.getValue(), config.getAttribute( "path" ) ); if ( holderClass == null ) { return null; } DataModel dataModel = dataModelerService.loadModel( projectService.resolveProject( getPath( path ) ) ); isExternal = dataModel.isExternal( config.getValue() ); dataHolder = new DataModelerDataHolder( config.getHolderId(), config.getInputId(), config.getOutputId(), holderClass, config.getRenderColor() ); } if ( isExternal ) { dataHolder.setSupportedType( PojoDataHolderBuilder.HOLDER_TYPE_POJO_CLASSNAME ); } return dataHolder; } protected Class findHolderClass( String className, String path ) { ClassLoader classLoader = getProjectClassLoader( projectService.resolveProject( getPath( path ) ) ); try { return classLoader.loadClass( className ); } catch ( ClassNotFoundException e ) { log.warn( "Unable to load class '{}': {}", className, e ); } return null; } @Override public String getId() { return HOLDER_TYPE_DATA_MODEL; } protected Path getPath( String path ) { try { return Paths.convert( ioService.get( new URI( path ) ) ); } catch ( Exception e ) { log.error( "Unable to build Path for {}': {}", path, e ); } return null; } @Override public boolean supportsPropertyType( String className, String path ) { return getDataObject( className, getPath( path ) ) != null; } protected DataObject getDataObject( String className, Path path ) { DataModel dataModel = getDataModel( path ); DataObject result = dataModel.getDataObject( className ); if ( result == null ) { for ( DataObject externalDataObject : dataModel.getExternalClasses() ) { if ( className.equals( externalDataObject.getClassName() ) ) { return externalDataObject; } } } return result; } protected DataModel getDataModel( Path path ) { KieProject project = projectService.resolveProject( path ); return dataModelerService.loadModel( project ); } @Override public int getPriority() { return 2; } @Override public String[] getSupportedHolderTypes() { return new String[]{ PojoDataHolderBuilder.HOLDER_TYPE_POJO_CLASSNAME }; } protected ClassLoader getProjectClassLoader( KieProject project ) { final KieModule module = buildInfoService.getBuildInfo( project ).getKieModuleIgnoringErrors(); final ClassLoader classLoader = KieModuleMetaData.Factory.newKieModuleMetaData( module ).getClassLoader(); return classLoader; } @Override public String getDataHolderName( Locale locale ) { ResourceBundle bundle = ResourceBundle.getBundle( "org.jbpm.formModeler.dataModeler.messages", locale ); return bundle.getString( "dataHolder_dataModeler" ); } }