public File getFile() {
   String filename = getFilename();
   if (StringUtils.isNullOrEmpty(filename)) {
     return null;
   }
   return new File(filename);
 }
  /**
   * Gets an output column by name.
   *
   * @see #getOutputColumns()
   * @param name
   * @return
   */
  public MutableInputColumn<?> getOutputColumnByName(String name) {
    if (StringUtils.isNullOrEmpty(name)) {
      return null;
    }

    final List<MutableInputColumn<?>> outputColumns = getOutputColumns();
    for (MutableInputColumn<?> inputColumn : outputColumns) {
      if (name.equals(inputColumn.getName())) {
        return inputColumn;
      }
    }
    return null;
  }
 @Override
 protected String getJdbcUrl(
     String hostname,
     int port,
     String database,
     String param1,
     String param2,
     String param3,
     String param4) {
   if (_radioSid.isSelected()) {
     return replaceParameters(URL_SID_BASED, hostname, port, database, param1, param2, param3);
   } else if (_radioServiceName.isSelected()) {
     if (!StringUtils.isNullOrEmpty(database)) {
       return replaceParameters(
           URL_SERVICE_NAME_BASED, hostname, port, database, param1, param2, param3);
     }
   }
   return replaceParameters(URL_FALLBACK, hostname, port, database, param1, param2, param3);
 }
  public static String safeName(String str) {
    if (StringUtils.isNullOrEmpty(str)) {
      throw new IllegalArgumentException("Cannot create safe name from empty/null string: " + str);
    }

    CharIterator ci = new CharIterator(str);
    while (ci.hasNext()) {
      ci.next();
      if (!ci.isLetter() && !ci.isDigit()) {
        // replaces unexpected chars with underscore
        ci.set('_');
      }
    }

    str = ci.toString();
    if (!Character.isLetter(str.charAt(0))) {
      str = "db" + str;
    }
    return str;
  }
 @Override
 protected UsageAwareDatastoreConnection<UpdateableDataContext> createDatastoreConnection() {
   if (StringUtils.isNullOrEmpty(_datasourceJndiUrl)) {
     if (isMultipleConnections()) {
       final DataSource dataSource = createDataSource();
       return new DataSourceDatastoreConnection(dataSource, getTableTypes(), _catalogName, this);
     } else {
       final Connection connection = createConnection();
       final UpdateableDataContext dataContext =
           new JdbcDataContext(connection, getTableTypes(), _catalogName);
       return new UpdateableDatastoreConnectionImpl<UpdateableDataContext>(dataContext, this);
     }
   } else {
     try {
       Context initialContext = getJndiNamingContext();
       DataSource dataSource = (DataSource) initialContext.lookup(_datasourceJndiUrl);
       return new DataSourceDatastoreConnection(dataSource, getTableTypes(), _catalogName, this);
     } catch (Exception e) {
       logger.error("Could not retrieve DataSource '{}'", _datasourceJndiUrl);
       throw new IllegalStateException(e);
     }
   }
 }
  /**
   * Gets the output column of this transformation with it's current configuration.
   *
   * @return
   */
  public List<MutableInputColumn<?>> getOutputColumns() {
    final Component component = getComponentInstanceForQuestioning();
    if (component == null) {
      // as long as the transformer is not configured, just return an
      // empty list
      return Collections.emptyList();
    }

    final Transformer transformer = (Transformer) component;

    final OutputColumns outputColumns = transformer.getOutputColumns();
    if (outputColumns == null) {
      throw new IllegalStateException(
          "getOutputColumns() returned null on transformer: " + transformer);
    }
    boolean changed = false;

    // adjust the amount of output columns
    final int expectedCols = outputColumns.getColumnCount();
    final int existingCols = _outputColumns.size();
    if (expectedCols != existingCols) {
      changed = true;
      int colDiff = expectedCols - existingCols;
      if (colDiff > 0) {
        for (int i = 0; i < colDiff; i++) {
          final int nextIndex = _outputColumns.size();
          final String name = getColumnName(outputColumns, nextIndex);
          final String id = _id + "-" + _idGenerator.nextId();
          _outputColumns.add(new TransformedInputColumn<Object>(name, id));
          _automaticOutputColumnNames.add(name);
        }
      } else if (colDiff < 0) {
        for (int i = 0; i < Math.abs(colDiff); i++) {
          // remove from the tail
          _outputColumns.remove(_outputColumns.size() - 1);
          _automaticOutputColumnNames.remove(_automaticOutputColumnNames.size() - 1);
        }
      }

      // reset the names when the number of output columns change and the
      // initial name has changed
      for (int i = 0; i < expectedCols; i++) {
        final MutableInputColumn<?> column = _outputColumns.get(i);
        final String previousProposedName = column.getInitialName();
        final String newProposedName = outputColumns.getColumnName(i);
        if (newProposedName != null && !newProposedName.equals(previousProposedName)) {
          column.setName(newProposedName);
        }
      }
    }

    // automatically update names and types of columns if they have not been
    // manually set
    for (int i = 0; i < expectedCols; i++) {
      final String proposedName = getColumnName(outputColumns, i);
      final Class<?> dataType = outputColumns.getColumnType(i);

      final TransformedInputColumn<?> col = (TransformedInputColumn<?>) _outputColumns.get(i);
      col.setInitialName(proposedName);
      if (dataType != col.getDataType()) {
        col.setDataType(dataType);
        changed = true;
      }

      final String automaticName = _automaticOutputColumnNames.get(i);
      final String columnName = col.getName();
      if (StringUtils.isNullOrEmpty(columnName) || automaticName.equals(columnName)) {
        if (proposedName != null) {
          col.setName(proposedName);
          _automaticOutputColumnNames.set(i, proposedName);
        }
      }
    }

    if (changed) {
      // notify listeners
      onOutputChanged();
    }

    return Collections.unmodifiableList(_outputColumns);
  }