All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.opitzconsulting.orcas.diff.ExtensionHandlerImpl Maven / Gradle / Ivy

package de.opitzconsulting.orcas.diff;

import java.sql.CallableStatement;
import java.sql.SQLException;
import java.sql.Struct;
import java.util.List;
import java.net.URL;
import java.util.function.UnaryOperator;
import java.util.stream.Collectors;

import com.opitzconsulting.orcas.xslt.XsltExtractDirAccessClass;

import org.apache.commons.logging.Log;

import de.opitzconsulting.OrcasDslStandaloneSetup;
import de.opitzconsulting.orcas.diff.JdbcConnectionHandler.RunWithCallableStatementProvider;
import de.opitzconsulting.orcas.extensions.AllExtensions;
import de.opitzconsulting.orcas.orig.diff.DiffRepository;
import de.opitzconsulting.orcas.sql.CallableStatementProvider;
import de.opitzconsulting.orcas.sql.WrapperCallableStatement;
import de.opitzconsulting.orcas.syex.load.DataReader;
import de.opitzconsulting.orcas.syex.trans.TransformOrigSyex;
import de.opitzconsulting.orcas.syex.trans.TransformSyexOrig;
import de.opitzconsulting.orcas.syex.xml.XmlExport;
import de.opitzconsulting.orcasDsl.OrcasDslPackage;
import de.opitzconsulting.orcasDsl.Sequence;
import de.opitzconsulting.orcasDsl.Table;
import de.opitzconsulting.orcasDsl.impl.ModelImpl;
import de.opitzconsulting.origOrcasDsl.Model;


public class ExtensionHandlerImpl extends BaseExtensionHandlerImpl
{
  protected de.opitzconsulting.orcasDsl.Model loadModelFromSqlplusTable() throws Exception
  {
    final de.opitzconsulting.orcasDsl.Model lOutputModel = new ModelImpl();

    JdbcConnectionHandler.runWithCallableStatementProvider( getParameters(), getParameters().getOrcasJdbcConnectParameters(), new RunWithCallableStatementProvider()
    {
      public void run( CallableStatementProvider pCallableStatementProvider ) throws Exception
      {
        String lCallExtensions = "" + //
        " declare" + " v_model " + getParameters().getOrcasDbUser() + ".ot_syex_model;" + " v_anydata SYS.ANYDATA;" + " begin " + //
        "   select model into v_anydata from " + getParameters().getOrcasDbUser() + ".orcas_sqlplus_model;" + " if( v_anydata.getObject( v_model ) = DBMS_TYPES.SUCCESS )" + " then " + "    null; " + " end if;" + //
        " ? := v_model;" + //
        " end; " + //
        "";

        new WrapperCallableStatement( lCallExtensions, pCallableStatementProvider )
        {
          @Override
          protected void useCallableStatement( CallableStatement pCallableStatement ) throws SQLException
          {
            pCallableStatement.registerOutParameter( 1, java.sql.Types.STRUCT, (getParameters().getOrcasDbUser() + ".ot_syex_model").toUpperCase() );

            pCallableStatement.execute();

            DataReader.setIntNullValue( DiffRepository.getNullIntValue() );
            DataReader.loadIntoModel( lOutputModel, (Struct) pCallableStatement.getObject( 1 ) );
          }
        }.execute();
      }
    } );

    return lOutputModel;
  }

  @Override
  public Model loadModel()
  {
    return TransformSyexOrig.convertModel( loadSyexModel() );
  }

  public de.opitzconsulting.orcasDsl.Model loadSyexModel()
  {
    de.opitzconsulting.orcasDsl.Model lSyexModel;
    if( getParameters().getModelFile().endsWith( "xml" ) )
    {
      lSyexModel = createlXtextFileLoader().loadModelXml( getParameters().getModelFile(), OrcasDslPackage.eNS_URI, OrcasDslPackage.eINSTANCE );
    }
    else
    {
      if( getParameters().getSqlplustable() )
      {
        logInfo( "loading sqlplus data" );
        try
        {
          lSyexModel = loadModelFromSqlplusTable();
        }
        catch( Exception e )
        {
          throw new RuntimeException( e );
        }
      }
      else
      {
        logInfo( "loading files" );
        lSyexModel = loadSyexModelFromFiles();
      }

      AllExtensions lAllExtensions = new AllExtensions();
      lAllExtensions.setUseReverseExtension( false );
      if( lAllExtensions.hasExtension() )
      {
        logInfo( "calling java extensions" );
        lSyexModel = callJavaExtensions( lSyexModel, lAllExtensions );
      }

      List> lAdditionalExtensions = getParameters().getAdditionalOrcasExtensionFactory().getAdditionalExtensions( de.opitzconsulting.orcasDsl.Model.class, false );
      if( !lAdditionalExtensions.isEmpty() )
      {
        logInfo( "calling additional extensions" );
        for( UnaryOperator lOrcasExtension : lAdditionalExtensions )
        {
          lSyexModel = lOrcasExtension.apply( lSyexModel );
        }
      }

      if( PlSqlHandler.isPlSqlEextensionsExistst() )
      {
        logInfo( "calling pl/sql extensions" );
        try
        {
          lSyexModel = PlSqlHandler.callPlSqlExtensions( lSyexModel, getParameters(), false );
        }
        catch( Exception e )
        {
          throw new RuntimeException( e );
        }
      }
    }

    return lSyexModel;
  }

  @Override
  protected XtextFileLoader createlXtextFileLoader()
  {
    return new XtextFileLoader()
    {

      @Override
      protected List getTableNames(de.opitzconsulting.orcasDsl.Model pModel) {
        return pModel.getModel_elements()
              .stream()
              .filter(p->p instanceof Table)
              .map(p->(Table)p)
              .map(Table::getName)
              .map(String::toUpperCase)
              .collect(Collectors.toList());
      }

      @Override
      protected List getSequenceNames(de.opitzconsulting.orcasDsl.Model pModel) {
        return pModel.getModel_elements()
                     .stream()
                     .filter(p->p instanceof Sequence)
                     .map(p->(Sequence)p)
                     .map(Sequence::getSequence_name)
                     .map(String::toUpperCase)
                     .collect(Collectors.toList());
      }

      @Override
      protected void combinModelResults( de.opitzconsulting.orcasDsl.Model pCombinedModel, de.opitzconsulting.orcasDsl.Model pModelPartFromSingleFile )
      {
        pCombinedModel.getModel_elements().addAll( pModelPartFromSingleFile.getModel_elements() );
      }

      @Override
      protected de.opitzconsulting.orcasDsl.Model createModelInstance()
      {
        return new ModelImpl();
      }

      @Override
      protected String getXtextExpectedFileEnding()
      {
        return "orcasdsl";
      }
    };
  }

  @Override
  public String convertModelToXMLString( Model lOrigModel )
  {
    de.opitzconsulting.orcasDsl.Model lSyexModel = TransformOrigSyex.convertModel( lOrigModel );

    if( getParameters().getModelFiles() != null || !getParameters().getModelFile().equals( "" ) )
    {
      logInfo( "loading additional model files" );
      lSyexModel.getModel_elements().addAll( loadSyexModelFromFiles().getModel_elements() );
    }

    if( PlSqlHandler.isPlSqlEextensionsExistst() && getParameters().isLoadExtractWithReverseExtensions() )
    {
      logInfo( "calling pl/sql reverse-extensions" );
      try
      {
        lSyexModel = PlSqlHandler.callPlSqlExtensions( lSyexModel, getParameters(), true );
      }
      catch( Exception e )
      {
        throw new RuntimeException( e );
      }
    }

    AllExtensions lAllExtensions = new AllExtensions();
    lAllExtensions.setUseReverseExtension( true );
    if( lAllExtensions.hasExtension() )
    {
      logInfo( "calling java reverse-extensions" );
      lSyexModel = callJavaExtensions( lSyexModel, lAllExtensions );
    }

    List> lAdditionalReverseExtensions = getParameters().getAdditionalOrcasExtensionFactory().getAdditionalExtensions( de.opitzconsulting.orcasDsl.Model.class, true );
    if( !lAdditionalReverseExtensions.isEmpty() )
    {
      logInfo( "calling additional reverse-extensions" );
      for( UnaryOperator lOrcasExtension : lAdditionalReverseExtensions )
      {
        lSyexModel = lOrcasExtension.apply( lSyexModel );
      }
    }

    return new XmlExport().getModel( lSyexModel, true );
  }

  protected de.opitzconsulting.orcasDsl.Model callJavaExtensions( de.opitzconsulting.orcasDsl.Model pSyexModel, AllExtensions pAllExtensions )
  {
    if( getParameters().getExtensionParameter().length() != 0 )
    {
      pAllExtensions.setParameter( getParameters().getExtensionParameter() );
    }
    pSyexModel = pAllExtensions.transformModel( pSyexModel );

    return pSyexModel;
  }

  @Override
  public void handleTargetplsql( CallableStatementProvider pCallableStatementProvider )
  {
    logInfo( "executing " + getParameters().getTargetplsql() );
    PlSqlHandler.callTargetPlSql( loadSyexModelFromFiles(), getParameters(), pCallableStatementProvider );
  }

  protected de.opitzconsulting.orcasDsl.Model loadSyexModelFromFiles()
  {
    return loadSyexModelFromFiles( new OrcasDslStandaloneSetup().createInjectorAndDoEMFRegistration() );
  }

  @Override
  public void initOrcasDbIfNeeded( Log pLog )
  {
    new OrcasInitializeOrcasDbImpl( getParameters() ).initOrcasDb( pLog );
  }

  
  @Override
  public URL getXsltExtractFileURL()
  {
    return XsltExtractDirAccessClass.getXsltExtractFileURL();
  }

  @Override
  public URL getUriResolverURLForImport( String pHref )
  {
    return XsltExtractDirAccessClass.getUriResolverURLForImport( pHref );
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy