blob: de6f707ba38cb424043b686783630b6fda7fb8b0 [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.web.beans.wizard;
import java.awt.Component;
import java.io.IOException;
import java.util.*;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.event.ChangeListener;
import org.netbeans.api.j2ee.core.Profile;
import org.netbeans.api.java.project.JavaProjectConstants;
import org.netbeans.api.project.Project;
import org.netbeans.api.project.SourceGroup;
import org.netbeans.api.project.Sources;
import org.netbeans.modules.j2ee.api.ejbjar.Car;
import org.netbeans.modules.j2ee.api.ejbjar.EjbJar;
import org.netbeans.modules.j2ee.common.J2eeProjectCapabilities;
import org.netbeans.modules.j2ee.common.dd.DDHelper;
import org.netbeans.modules.web.api.webmodule.WebModule;
import org.netbeans.modules.web.api.webmodule.WebProjectConstants;
import org.netbeans.modules.web.beans.CdiUtil;
import org.netbeans.spi.project.ui.templates.support.Templates;
import org.netbeans.spi.project.ui.templates.support.Templates.SimpleTargetChooserBuilder;
import org.openide.WizardDescriptor;
import org.openide.WizardDescriptor.Panel;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.loaders.DataObject;
import org.openide.loaders.TemplateWizard;
import org.openide.util.Exceptions;
import org.openide.util.HelpCtx;
import org.openide.util.NbBundle;
/**
* A template wizard operator for new beans.xml
*/
public class BeansXmlIterator implements TemplateWizard.Iterator {
private enum J2eeProjectType {
WAR,
JAR,
CAR
}
private static final String WEB_INF = "WEB-INF"; // NOI18N
private static final String META_INF = "META-INF"; // NOI18N
private int index;
private static final String defaultName = "beans"; //NOI18N
private transient WizardDescriptor.Panel[] panels;
private transient J2eeProjectType type;
@Override
public Set<DataObject> instantiate(TemplateWizard wizard) throws IOException {
String targetName = Templates.getTargetName(wizard);
FileObject targetDir = Templates.getTargetFolder(wizard);
Project project = Templates.getProject(wizard);
Profile profile = null;
if (project != null) {
J2eeProjectCapabilities cap = J2eeProjectCapabilities.forProject(project);
if (cap != null && cap.isCdi40Supported()) {
profile = Profile.JAKARTA_EE_10_FULL;
} else if (cap != null && cap.isCdi30Supported()) {
profile = Profile.JAKARTA_EE_9_FULL;
} else if (cap != null && cap.isCdi20Supported()) {
profile = Profile.JAVA_EE_8_FULL;
} else if (cap != null && cap.isCdi11Supported()) {
profile = Profile.JAVA_EE_7_FULL;
}
}
FileObject fo = DDHelper.createBeansXml(profile != null ? profile : Profile.JAVA_EE_6_FULL, targetDir, targetName);
if (fo != null) {
if ( project != null ){
CdiUtil logger = project.getLookup().lookup( CdiUtil.class );
if (logger != null){
logger.log("USG_CDI_BEANS_WIZARD", BeansXmlIterator.class,
new Object[]{project.getClass().getName()}, true);
}
}
return Collections.singleton(DataObject.find(fo));
}
else {
return Collections.EMPTY_SET;
}
}
@Override
public void initialize(TemplateWizard wizard) {
WizardDescriptor.Panel folderPanel;
Project project = Templates.getProject( wizard );
FileObject targetFolder = getTargetFolder(project);
Sources sources = project.getLookup().lookup(Sources.class);
SourceGroup[] sourceGroups;
String parentFolder = null;
if ( type == J2eeProjectType.WAR){
sourceGroups = sources.getSourceGroups(WebProjectConstants.TYPE_DOC_ROOT);
if ( targetFolder!=null && targetFolder.getFileObject(defaultName+".xml")!=null){
parentFolder = WEB_INF;
}
}
else {
if ( type != null &&
targetFolder!=null && targetFolder.getFileObject(defaultName+".xml")!=null )
{
parentFolder = targetFolder.getName();
}
sourceGroups = sources.getSourceGroups(Sources.TYPE_GENERIC);
}
SimpleTargetChooserBuilder builder = Templates.
buildSimpleTargetChooser(project, sourceGroups);
builder = builder.bottomPanel( new FakePanel(parentFolder));
folderPanel = builder.create();
panels = new WizardDescriptor.Panel[] { folderPanel };
// Creating steps.
Object prop = wizard.getProperty (WizardDescriptor.PROP_CONTENT_DATA); // NOI18N
String[] beforeSteps = null;
if (prop instanceof String[]) {
beforeSteps = (String[])prop;
}
String[] steps = createSteps(beforeSteps, panels);
for (int i = 0; i < panels.length; i++) {
JComponent jc = (JComponent)panels[i].getComponent ();
if (steps[i] == null) {
steps[i] = jc.getName ();
}
jc.putClientProperty (WizardDescriptor.PROP_CONTENT_SELECTED_INDEX, i);
jc.putClientProperty (WizardDescriptor.PROP_CONTENT_DATA, steps);
}
Templates.setTargetName(wizard, defaultName);
Templates.setTargetFolder(wizard, targetFolder );
}
private FileObject getTargetFolder(Project project) {
WebModule wm = WebModule.getWebModule(project.getProjectDirectory());
if (wm != null) {
FileObject webInf = wm.getWebInf();
if (webInf == null && wm.getDocumentBase() != null) {
try {
webInf = FileUtil.createFolder(wm.getDocumentBase(), WEB_INF);
} catch (IOException ex) {
Exceptions.printStackTrace(ex);
}
}
type = J2eeProjectType.WAR;
return webInf;
}
else {
EjbJar ejbs[] = EjbJar.getEjbJars(project);
if (ejbs.length > 0) {
type = J2eeProjectType.JAR;
return ejbs[0].getMetaInf();
} else {
Car cars[] = Car.getCars(project);
if (cars.length > 0) {
type = J2eeProjectType.CAR;
return cars[0].getMetaInf();
}
}
}
Sources sources = project.getLookup().lookup(Sources.class);
SourceGroup[] sourceGroups = sources.getSourceGroups(
JavaProjectConstants.SOURCES_TYPE_JAVA);
if ( sourceGroups.length >0 ){
FileObject metaInf = sourceGroups[0].getRootFolder().getFileObject(
META_INF );
if ( metaInf == null ){
try {
metaInf = FileUtil.createFolder(
sourceGroups[0].getRootFolder(), META_INF);
}
catch( IOException e ){
Exceptions.printStackTrace(e);
}
}
if ( metaInf != null ){
return metaInf;
}
}
return project.getProjectDirectory();
}
@Override
public void uninitialize(TemplateWizard wiz) {
panels = null;
}
@Override
public Panel<WizardDescriptor> current() {
return panels[index];
}
@Override
public String name() {
return NbBundle.getMessage(BeansXmlIterator.class, "TITLE_x_of_y",
index + 1, panels.length);
}
@Override
public boolean hasNext() {
return index < panels.length - 1;
}
@Override
public boolean hasPrevious() {
return index > 0;
}
@Override
public void nextPanel() {
if (! hasNext ()) throw new NoSuchElementException ();
index++;
}
@Override
public void previousPanel() {
if (! hasPrevious ()) throw new NoSuchElementException ();
index--;
}
@Override
public void addChangeListener(ChangeListener l) {
}
@Override
public void removeChangeListener(ChangeListener l) {
}
public static String[] createSteps(String[] before, WizardDescriptor.Panel[] panels) {
//assert panels != null;
// hack to use the steps set before this panel processed
int diff = 0;
if (before == null) {
before = new String[0];
} else if (before.length > 0) {
diff = ("...".equals (before[before.length - 1])) ? 1 : 0; // NOI18N
}
String[] res = new String[ (before.length - diff) + panels.length];
for (int i = 0; i < res.length; i++) {
if (i < (before.length - diff)) {
res[i] = before[i];
} else {
res[i] = panels[i - before.length + diff].getComponent ().getName ();
}
}
return res;
}
static class FakePanel implements Panel {
private String folder ;
FakePanel(String folder ){
this.folder = folder;
}
@Override
public Component getComponent() {
return new JPanel();
}
@Override
public HelpCtx getHelp() {
return null;
}
@Override
public void readSettings(Object settings) {
if ( folder!=null ){
((WizardDescriptor)settings).putProperty(
WizardDescriptor.PROP_ERROR_MESSAGE,
NbBundle.getMessage( BeansXmlIterator.class ,
"ERR_BeansAlreadyExists", folder));
}
}
@Override
public void storeSettings(Object settings) {
}
@Override
public boolean isValid() {
return folder == null;
}
@Override
public void addChangeListener(ChangeListener l) {
}
@Override
public void removeChangeListener(ChangeListener l) {
}
}
}