/**
 *                                                                            
 * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
 *                                                                            
 * All rights reserved. This program and the accompanying materials           
 * are made available under the terms of the Eclipse Public License 2.0        
 * which accompanies this distribution, and is available at                  
 * https://www.eclipse.org/legal/epl-2.0/                                 
 *                                 
 * SPDX-License-Identifier: EPL-2.0                                 
 *                                                                            
 * Contributors:   
 * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation 
 */
package org.eclipse.osbp.preferences.ui.constants;

import java.util.List;

import org.eclipse.osbp.preferences.EnumDatabaseVendor;

import com.google.common.collect.ImmutableList;

public interface LicenseConstants {
	final List<String> LICENSED_DATABASE_VENDORS = ImmutableList.of(EnumDatabaseVendor.ORACLE.getDriverVendor(), EnumDatabaseVendor.MYSQL.getDriverVendor());
	final String DATABASE_VENDOR = "{$DATABASE_VENDOR}";
	final String LICENSE_TITLE_TEXT = "LICENSE";
	final String LICENSE_MESSAGE_TEXT = DATABASE_VENDOR + " LICENSE!";
}
