blob: 34038e4cd0e28f30f8557e24e6e0079bfeb4174a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.netbeans.modules.j2ee.persistence.wizard.unit;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.event.AncestorEvent;
import javax.swing.event.AncestorListener;
import javax.swing.event.ChangeListener;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.JTextComponent;
import org.netbeans.api.java.project.JavaProjectConstants;
import org.netbeans.api.project.Project;
import org.netbeans.api.project.ProjectUtils;
import org.netbeans.api.project.SourceGroup;
import org.netbeans.api.project.Sources;
import org.netbeans.modules.j2ee.core.api.support.Strings;
import org.netbeans.modules.j2ee.persistence.dd.common.Persistence;
import org.netbeans.modules.j2ee.persistence.provider.DefaultProvider;
import org.netbeans.modules.j2ee.persistence.provider.InvalidPersistenceXmlException;
import org.netbeans.modules.j2ee.persistence.provider.Provider;
import org.netbeans.modules.j2ee.persistence.provider.ProviderUtil;
import org.netbeans.modules.j2ee.persistence.spi.datasource.JPADataSource;
import org.netbeans.modules.j2ee.persistence.spi.datasource.JPADataSourcePopulator;
import org.netbeans.modules.j2ee.persistence.util.PersistenceProviderComboboxHelper;
import org.netbeans.modules.j2ee.persistence.util.SourceLevelChecker;
import org.netbeans.modules.j2ee.persistence.wizard.Util;
import org.netbeans.modules.j2ee.persistence.wizard.unit.PersistenceUnitWizardPanel.TableGeneration;
import org.openide.util.ImageUtilities;
import org.openide.util.NbBundle;
import org.openide.util.RequestProcessor;
/**
*
* @author Martin Adamek
*/
public class PersistenceUnitWizardPanelDS extends PersistenceUnitWizardPanel implements AncestorListener {
private final RequestProcessor RP = new RequestProcessor(PersistenceUnitWizardPanelDS.class.getSimpleName(), 2);
public PersistenceUnitWizardPanelDS(Project project, ChangeListener changeListener, boolean editName) {
this(project, changeListener, editName, TableGeneration.CREATE);
}
public PersistenceUnitWizardPanelDS(final Project project, ChangeListener changeListener,
boolean editName, TableGeneration tg) {
super(project);
initComponents();
setTableGeneration(tg);
providerCombo.setEnabled(false);
RP.post(new Runnable() {
@Override
public void run() {
PersistenceProviderComboboxHelper comboHelper = new PersistenceProviderComboboxHelper(project);
comboHelper.connect(providerCombo);
providerCombo.setEnabled(true);
checkValidity();
}
});
PersistenceProviderComboboxHelper comboHelper = new PersistenceProviderComboboxHelper(project);
comboHelper.connect(providerCombo);
unitNameTextField.setText(Util.getCandidateName(project));
unitNameTextField.selectAll();
// unit name editing is not available when adding first PU
unitNameTextField.setVisible(editName);
unitNameLabel.setVisible(editName);
unitNameTextField.getDocument().addDocumentListener(new ValidationListener());
errorMessage.setForeground(Color.RED);
updateWarning();
addAncestorListener(this);//need to postpone initialization, see issue 202022
}
private void initLater(){
if (ProviderUtil.isValidServerInstanceOrNone(project)){
if(SwingUtilities.isEventDispatchThread()){
connectDatasources();
} else {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
connectDatasources();
}
});
}
}
}
@Override
public void ancestorAdded(AncestorEvent event) {
initLater();
removeAncestorListener(this);
}
@Override
public void ancestorRemoved(AncestorEvent event) {
}
@Override
public void ancestorMoved(AncestorEvent event) {
}
/**
* Pre-selects appropriate table generation strategy radio button.
*/
private void setTableGeneration(TableGeneration tg){
if (TableGeneration.CREATE.equals(tg)){
ddlCreate.setSelected(true);
} else if (TableGeneration.DROP_CREATE.equals(tg)){
ddlDropCreate.setSelected(true);
} else {
ddlUnkown.setSelected(true);
}
}
private void connectDatasources() {
JPADataSourcePopulator dsPopulator = project.getLookup().lookup(JPADataSourcePopulator.class);
dsPopulator.connect(dsCombo);
dsCombo.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
checkValidity();
}
});
((JTextComponent)dsCombo.getEditor().getEditorComponent()).
getDocument().addDocumentListener(new DocumentListener() {
@Override
public void changedUpdate(DocumentEvent e) {
checkValidity();
}
@Override
public void insertUpdate(DocumentEvent e) {
checkValidity();
}
@Override
public void removeUpdate(DocumentEvent e) {
checkValidity();
}
});
}
/**
* Checks whether this panel is in valid state (see <code>#isValidPanel()</code>)
* and fires appropriate property changes.
*/
private void checkValidity(){
if (isValidPanel()) {
firePropertyChange(IS_VALID, false, true);
} else {
firePropertyChange(IS_VALID, true, false);
}
}
@Override
public String getPersistenceUnitName() {
return unitNameTextField.getText();
}
public String getDatasource() {
return ((JTextComponent)dsCombo.getEditor().getEditorComponent()).getText();
}
@Override
public void setPreselectedDB(String db) {
boolean hasItem = false;
for (int i = 0; i < dsCombo.getItemCount(); i++) {
if (dsCombo.getItemAt(i) instanceof JPADataSource) {
JPADataSource ds = (JPADataSource) dsCombo.getItemAt(i);
if (ds.getJndiName().equals(db)) {
hasItem = true;
break;
}
}
}
dsCombo.setSelectedItem(db);
dsCombo.setEnabled(!hasItem);
}
public boolean isNonDefaultProviderEnabled() {
return !(providerCombo.getSelectedItem() instanceof DefaultProvider);
}
public String getNonDefaultProvider() {
return ((Provider) providerCombo.getSelectedItem()).getProviderClass();
}
public boolean isJTA() {
return jtaCheckBox.isEnabled() && jtaCheckBox.isSelected();
}
@Override
public String getTableGeneration() {
if (ddlCreate.isSelected()) {
return Provider.TABLE_GENERATION_CREATE;
} else if (ddlDropCreate.isSelected()) {
return Provider.TABLE_GENERATION_DROPCREATE;
} else {
return Provider.TABLE_GENERATTION_UNKOWN;
}
}
@Override
public boolean isValidPanel() {
setErrorMessage("");
Sources sources=ProjectUtils.getSources(project);
SourceGroup groups[]=sources.getSourceGroups(JavaProjectConstants.SOURCES_TYPE_JAVA);
if(groups == null || groups.length == 0) {
setErrorMessage(NbBundle.getMessage(PersistenceUnitWizardDescriptor.class,"ERR_JavaSourceGroup")); //NOI18N
return false;
}
if( !providerCombo.isEnabled() ) {
setErrorMessage(NbBundle.getMessage(PersistenceUnitWizardPanelDS.class,"LBL_Wait")); //NOI18N
return false;
}
try{
if (!isNameValid()){
return false;
}
} catch (InvalidPersistenceXmlException ipx){
setErrorMessage(NbBundle.getMessage(PersistenceUnitWizardDescriptor.class,"ERR_InvalidPersistenceXml", ipx.getPath())); //NOI18N
return false;
}
return true;
}
/**
* Checks whether name of the persistence unit is valid, i.e. it's not
* empty and it's unique.
*/
private boolean isNameValid() throws InvalidPersistenceXmlException{
return Strings.isEmpty(getPersistenceUnitName()) ? false : isNameUnique();
}
@Override
public Provider getSelectedProvider() {
return (Provider) providerCombo.getSelectedItem();
}
public void setErrorMessage(String msg){
errorMessage.setText(msg);
errorMessage.setVisible(msg!=null && msg.length()>0);
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
buttonGroup1 = new javax.swing.ButtonGroup();
tableCreationButtonGroup = new javax.swing.ButtonGroup();
unitNameLabel = new javax.swing.JLabel();
unitNameTextField = new javax.swing.JTextField();
jLabel1 = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel();
ddlCreate = new javax.swing.JRadioButton();
ddlDropCreate = new javax.swing.JRadioButton();
ddlUnkown = new javax.swing.JRadioButton();
datasourceLabel = new javax.swing.JLabel();
jtaCheckBox = new javax.swing.JCheckBox();
dsCombo = new javax.swing.JComboBox();
persistenceProviderLabel = new javax.swing.JLabel();
providerCombo = new javax.swing.JComboBox();
warnPanel = new javax.swing.JPanel();
errorMessage = new javax.swing.JLabel();
createPUWarningLabel = new ShyLabel();
setName(org.openide.util.NbBundle.getMessage(PersistenceUnitWizardPanelDS.class, "LBL_Step1")); // NOI18N
unitNameLabel.setDisplayedMnemonic(java.util.ResourceBundle.getBundle("org/netbeans/modules/j2ee/persistence/wizard/unit/Bundle").getString("MN_UnitName").charAt(0));
unitNameLabel.setLabelFor(unitNameTextField);
unitNameLabel.setText(org.openide.util.NbBundle.getMessage(PersistenceUnitWizardPanelDS.class, "LBL_UnitName")); // NOI18N
unitNameTextField.setColumns(40);
unitNameTextField.setText("em");
jLabel1.setText(org.openide.util.NbBundle.getMessage(PersistenceUnitWizardPanelDS.class, "LBL_SpecifyPersistenceProvider")); // NOI18N
jLabel2.setText(org.openide.util.NbBundle.getMessage(PersistenceUnitWizardPanelDS.class, "LBL_TableGeneration")); // NOI18N
tableCreationButtonGroup.add(ddlCreate);
ddlCreate.setMnemonic(java.util.ResourceBundle.getBundle("org/netbeans/modules/j2ee/persistence/wizard/unit/Bundle").getString("CHB_Create_mnem").charAt(0));
ddlCreate.setSelected(true);
ddlCreate.setText(org.openide.util.NbBundle.getMessage(PersistenceUnitWizardPanelDS.class, "LBL_Create")); // NOI18N
ddlCreate.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
tableCreationButtonGroup.add(ddlDropCreate);
ddlDropCreate.setMnemonic(java.util.ResourceBundle.getBundle("org/netbeans/modules/j2ee/persistence/wizard/unit/Bundle").getString("CHB_DropCreate_mnem").charAt(0));
ddlDropCreate.setText(org.openide.util.NbBundle.getMessage(PersistenceUnitWizardPanelDS.class, "LBL_DropCreate")); // NOI18N
ddlDropCreate.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
tableCreationButtonGroup.add(ddlUnkown);
ddlUnkown.setMnemonic(java.util.ResourceBundle.getBundle("org/netbeans/modules/j2ee/persistence/wizard/unit/Bundle").getString("CHB_None_mnem").charAt(0));
ddlUnkown.setText(org.openide.util.NbBundle.getMessage(PersistenceUnitWizardPanelDS.class, "LBL_None")); // NOI18N
ddlUnkown.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
datasourceLabel.setDisplayedMnemonic(java.util.ResourceBundle.getBundle("org/netbeans/modules/j2ee/persistence/wizard/unit/Bundle").getString("MN_DatasourceName").charAt(0));
datasourceLabel.setLabelFor(dsCombo);
datasourceLabel.setText(org.openide.util.NbBundle.getMessage(PersistenceUnitWizardPanelDS.class, "LBL_ServerDataSource")); // NOI18N
jtaCheckBox.setMnemonic(java.util.ResourceBundle.getBundle("org/netbeans/modules/j2ee/persistence/wizard/unit/Bundle").getString("CHB_JTA_mnem").charAt(0));
jtaCheckBox.setSelected(true);
jtaCheckBox.setText(org.openide.util.NbBundle.getMessage(PersistenceUnitWizardPanelDS.class, "LBL_JTA")); // NOI18N
jtaCheckBox.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
dsCombo.setEditable(true);
persistenceProviderLabel.setDisplayedMnemonic(java.util.ResourceBundle.getBundle("org/netbeans/modules/j2ee/persistence/wizard/unit/Bundle").getString("MN_Provider").charAt(0));
persistenceProviderLabel.setLabelFor(providerCombo);
java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("org/netbeans/modules/j2ee/persistence/wizard/unit/Bundle"); // NOI18N
persistenceProviderLabel.setText(bundle.getString("LBL_PersistenceProvider")); // NOI18N
providerCombo.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
providerComboItemStateChanged(evt);
}
});
warnPanel.setLayout(new java.awt.BorderLayout());
errorMessage.setMinimumSize(new java.awt.Dimension(10, 10));
errorMessage.setPreferredSize(new java.awt.Dimension(20, 20));
warnPanel.add(errorMessage, java.awt.BorderLayout.NORTH);
createPUWarningLabel.setText(" ");
createPUWarningLabel.setPreferredSize(new java.awt.Dimension(4, 20));
warnPanel.add(createPUWarningLabel, java.awt.BorderLayout.PAGE_END);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(unitNameLabel)
.addComponent(persistenceProviderLabel)
.addComponent(datasourceLabel))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(unitNameTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)
.addComponent(providerCombo, 0, 380, Short.MAX_VALUE)
.addComponent(dsCombo, 0, 380, Short.MAX_VALUE)))
.addGroup(layout.createSequentialGroup()
.addComponent(jLabel2)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(ddlCreate)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(ddlDropCreate)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(ddlUnkown))
.addComponent(jtaCheckBox)
.addComponent(jLabel1)
.addComponent(warnPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 560, Short.MAX_VALUE))
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(unitNameLabel)
.addComponent(unitNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jLabel1)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(persistenceProviderLabel)
.addComponent(providerCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(datasourceLabel)
.addComponent(dsCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jtaCheckBox)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(ddlCreate)
.addComponent(ddlDropCreate)
.addComponent(ddlUnkown)
.addComponent(jLabel2))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(warnPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addContainerGap(128, Short.MAX_VALUE))
);
unitNameLabel.getAccessibleContext().setAccessibleDescription(bundle.getString("ACSD_UnitName")); // NOI18N
unitNameTextField.getAccessibleContext().setAccessibleDescription(bundle.getString("ACSD_UnitName")); // NOI18N
jLabel2.getAccessibleContext().setAccessibleDescription(bundle.getString("ACSD_TableGeneration")); // NOI18N
ddlCreate.getAccessibleContext().setAccessibleDescription(bundle.getString("ACSD_Create")); // NOI18N
ddlDropCreate.getAccessibleContext().setAccessibleDescription(bundle.getString("ACSD_DropCreate")); // NOI18N
ddlUnkown.getAccessibleContext().setAccessibleDescription(bundle.getString("ACSD_None")); // NOI18N
datasourceLabel.getAccessibleContext().setAccessibleDescription(bundle.getString("ACSD_DatasourceName")); // NOI18N
jtaCheckBox.getAccessibleContext().setAccessibleDescription(bundle.getString("ACSD_JTA")); // NOI18N
persistenceProviderLabel.getAccessibleContext().setAccessibleName(bundle.getString("ACSD_Provider")); // NOI18N
persistenceProviderLabel.getAccessibleContext().setAccessibleDescription(bundle.getString("ACSD_Provider")); // NOI18N
providerCombo.getAccessibleContext().setAccessibleDescription(bundle.getString("ACSD_Provider")); // NOI18N
}// </editor-fold>//GEN-END:initComponents
private void providerComboItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_providerComboItemStateChanged
// TODO add your handling code here:
updateWarning();
}//GEN-LAST:event_providerComboItemStateChanged
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.ButtonGroup buttonGroup1;
private javax.swing.JLabel createPUWarningLabel;
private javax.swing.JLabel datasourceLabel;
private javax.swing.JRadioButton ddlCreate;
private javax.swing.JRadioButton ddlDropCreate;
private javax.swing.JRadioButton ddlUnkown;
private javax.swing.JComboBox dsCombo;
private javax.swing.JLabel errorMessage;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JCheckBox jtaCheckBox;
private javax.swing.JLabel persistenceProviderLabel;
private javax.swing.JComboBox providerCombo;
private javax.swing.ButtonGroup tableCreationButtonGroup;
private javax.swing.JLabel unitNameLabel;
private javax.swing.JTextField unitNameTextField;
private javax.swing.JPanel warnPanel;
// End of variables declaration//GEN-END:variables
private void updateWarning() {
Object provObj = providerCombo.getSelectedItem();
Provider prov = (Provider) (provObj instanceof Provider ? provObj : null);
String warning = null;
if(prov != null){
String ver = ProviderUtil.getVersion(prov);
if(ver!=null && !Persistence.VERSION_1_0.equals(ver)){
if(Util.isJPAVersionSupported(project, ver)){
String sourceLevel = SourceLevelChecker.getSourceLevel(project);
if(sourceLevel !=null ){
if(sourceLevel.matches("1\\.[0-5]([^0-9].*)?"))//1.0-1.5
warning = NbBundle.getMessage(PersistenceUnitWizard.class, "ERR_WrongSourceLevel", sourceLevel);
}
} else {
warning = NbBundle.getMessage(PersistenceUnitWizard.class, "ERR_UnsupportedJpaVersion", ver, Util.getJPAVersionSupported(project, ver));
}
}
}
ImageIcon icon = null;
if(warning != null){
icon = ImageUtilities.loadImageIcon("org/netbeans/modules/j2ee/persistence/ui/resources/warning.gif", false); //NOI18N
} else {
warning = " ";
}
createPUWarningLabel.setIcon(icon);
createPUWarningLabel.setText(warning);
createPUWarningLabel.setToolTipText(warning);
}
// End of variables declaration
/**
* Document listener that invokes <code>checkValidity</code> when
* changes are made.
*/
private class ValidationListener implements DocumentListener {
public void insertUpdate(DocumentEvent e) {
checkValidity();
}
public void removeUpdate(DocumentEvent e) {
checkValidity();
}
public void changedUpdate(DocumentEvent e) {
checkValidity();
}
}
/**
* A crude attempt at a label which doesn't expand its parent.
*/
private static final class ShyLabel extends JLabel {
@Override
public Dimension getPreferredSize() {
Dimension size = super.getPreferredSize();
size.width = 0;
return size;
}
@Override
public Dimension getMinimumSize() {
Dimension size = super.getMinimumSize();
size.width = 0;
return size;
}
}
}