blob: 1a300c03fd2e66f290981e195c8ba5fcdf3b6ffb [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2008 SAP AG and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Kaloyan Raev, kaloyan.raev@sap.com - initial API and implementation
*******************************************************************************/
package org.eclipse.jst.servlet.ui.internal.wizard;
import static org.eclipse.jst.j2ee.application.internal.operations.IAnnotationsDataModel.USE_ANNOTATIONS;
import static org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties.CLASS_NAME;
import static org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties.GENERATE_DD;
import static org.eclipse.jst.servlet.ui.internal.wizard.IWebWizardConstants.BROWSE_BUTTON_LABEL;
import static org.eclipse.jst.servlet.ui.internal.wizard.IWebWizardConstants.CLASS_NAME_LABEL;
import static org.eclipse.wst.common.componentcore.internal.operation.IArtifactEditOperationDataModelProperties.PROJECT_NAME;
import java.util.Iterator;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.ITypeHierarchy;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jst.j2ee.commonarchivecore.internal.util.J2EEFileUtil;
import org.eclipse.jst.j2ee.internal.J2EEConstants;
import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities;
import org.eclipse.jst.j2ee.internal.wizard.AnnotationsStandaloneGroup;
import org.eclipse.jst.j2ee.internal.wizard.NewJavaClassWizardPage;
import org.eclipse.jst.j2ee.model.IModelProvider;
import org.eclipse.jst.j2ee.model.ModelProviderManager;
import org.eclipse.jst.j2ee.project.WebUtilities;
import org.eclipse.jst.j2ee.web.IServletConstants;
import org.eclipse.jst.j2ee.web.project.facet.WebFacetUtils;
import org.eclipse.jst.servlet.ui.internal.navigator.CompressedJavaProject;
import org.eclipse.jst.servlet.ui.internal.plugin.ServletUIPlugin;
import org.eclipse.jst.servlet.ui.internal.plugin.WEBUIMessages;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.wst.common.componentcore.ComponentCore;
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
import org.eclipse.wst.common.project.facet.core.IFacetedProject;
import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
public abstract class NewWebClassWizardPage extends NewJavaClassWizardPage {
protected AnnotationsStandaloneGroup annotationsGroup;
protected Button existingClassButton;
protected Label existingClassLabel;
protected Text existingClassText;
protected Button existingButton;
public NewWebClassWizardPage(IDataModel model, String pageName, String pageDesc, String pageTitle, String moduleType) {
super(model, pageName, pageDesc, pageTitle, moduleType);
}
@Override
protected Composite createTopLevelComposite(Composite parent) {
Composite composite = super.createTopLevelComposite(parent);
projectNameLabel.setText(WEBUIMessages.WEB_PROJECT_LBL);
addSeperator(composite, 3);
createUseExistingGroup(composite);
createAnnotationsGroup(composite);
Dialog.applyDialogFont(composite);
return composite;
}
@Override
protected IProject getExtendedSelectedProject(Object selection) {
if (selection instanceof CompressedJavaProject) {
return ((CompressedJavaProject) selection).getProject().getProject();
}
return super.getExtendedSelectedProject(selection);
}
protected abstract String getUseExistingCheckboxText();
protected abstract String getUseExistingProperty();
protected abstract void handleClassButtonSelected();
/**
* Create annotations group and set default enablement
*/
private void createAnnotationsGroup(Composite parent) {
if (isWebDocletProject()) {
annotationsGroup = new AnnotationsStandaloneGroup(parent, model, J2EEProjectUtilities.EJB.equals(projectType),
J2EEProjectUtilities.DYNAMIC_WEB.equals(projectType));
if (!model.isPropertySet(PROJECT_NAME))
return;
IProject project = ProjectUtilities.getProject(model.getStringProperty(PROJECT_NAME));
annotationsGroup.setEnablement(project);
// annotationsGroup.setUseAnnotations(true);
} else {
// not a Web Doclet project - make sure that the USE_ANNOTATIONS property is off
model.setProperty(USE_ANNOTATIONS, false);
}
}
private void createUseExistingGroup(Composite composite) {
existingButton = new Button(composite, SWT.CHECK);
existingButton.setText(getUseExistingCheckboxText());
GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
data.horizontalSpan = 3;
existingButton.setLayoutData(data);
synchHelper.synchCheckbox(existingButton, getUseExistingProperty(), null);
existingButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleExistingButtonSelected();
}
});
existingClassLabel = new Label(composite, SWT.LEFT);
existingClassLabel.setText(CLASS_NAME_LABEL);
existingClassLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
existingClassLabel.setEnabled(false);
existingClassText = new Text(composite, SWT.SINGLE | SWT.BORDER | SWT.READ_ONLY);
existingClassText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
existingClassText.setEnabled(false);
synchHelper.synchText(existingClassText, CLASS_NAME, null);
existingClassButton = new Button(composite, SWT.PUSH);
existingClassButton.setText(BROWSE_BUTTON_LABEL);
existingClassButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
existingClassButton.setEnabled(false);
existingClassButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
handleClassButtonSelected();
}
});
}
private void handleExistingButtonSelected() {
boolean enable = existingButton.getSelection();
existingClassLabel.setEnabled(enable);
existingClassButton.setEnabled(enable);
packageText.setEnabled(!enable);
packageButton.setEnabled(!enable);
packageLabel.setEnabled(!enable);
classText.setEnabled(!enable);
classLabel.setEnabled(!enable);
superText.setEnabled(!enable);
superButton.setEnabled(!enable);
superLabel.setEnabled(!enable);
}
private boolean isWebDocletProject() {
String projectName = model.getStringProperty(PROJECT_NAME);
if(projectName != null && !"".equals(projectName.trim())){ //$NON-NLS-1$
IProject project = ProjectUtilities.getProject(projectName);
try {
IFacetedProject facetedProject = ProjectFacetsManager.create(project);
return facetedProject.hasProjectFacet(WebFacetUtils.WEB_XDOCLET_FACET);
} catch (CoreException e) {
ServletUIPlugin.log(e);
}
}
return false;
}
@Override
protected void validateProjectRequirements(IProject project)
{
IVirtualComponent component = ComponentCore.createComponent(project);
if(component.getRootFolder() != null
&& component.getRootFolder().getUnderlyingFolder() != null){
IFile ddXmlFile = component.getRootFolder().getUnderlyingFolder().getFile(new Path(J2EEConstants.WEBAPP_DD_URI));
if (!ddXmlFile.exists())
{
// add a flag into the model to create the DD at the beginning of the operation
model.setBooleanProperty(GENERATE_DD, Boolean.TRUE);
}
else
{
// don't create a DD, since one already exists.
model.setBooleanProperty(GENERATE_DD, Boolean.FALSE);
}
}
}
protected Object getSelectedObject() {
IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
if (window == null)
return null;
ISelection selection = window.getSelectionService().getSelection();
if (selection == null)
return null;
if (!(selection instanceof IStructuredSelection))
return null;
IStructuredSelection ssel = (IStructuredSelection) selection;
if (ssel.size() != 1)
return null;
return ssel.getFirstElement();
}
private IType getPrimaryType(ICompilationUnit cu) {
return cu.getType(new Path(cu.getElementName()).removeFileExtension().toString());
}
private boolean isObjectSubclassOf(Object obj, String base) {
IJavaElement jelem = getJavaElement(obj);
try {
if (jelem != null) {
if (jelem instanceof ICompilationUnit) {
ICompilationUnit cu = (ICompilationUnit) jelem;
jelem = getPrimaryType(cu);
}
if (jelem instanceof IType && ((IType) jelem).isClass()) {
IType type = (IType) jelem;
ITypeHierarchy typeHierarchy = type.newTypeHierarchy(null);
for (IType superType : typeHierarchy.getAllSuperInterfaces(type)) {
if (base.equals(superType.getFullyQualifiedName()))
return true;
}
}
}
} catch (JavaModelException e) {
ServletUIPlugin.log(e);
}
return false;
}
protected boolean isServlet(Object obj) {
if (obj instanceof org.eclipse.jst.javaee.web.Servlet)
return true;
if (obj instanceof org.eclipse.jst.j2ee.webapplication.Servlet)
return true;
return isObjectSubclassOf(obj, IServletConstants.QUALIFIED_SERVLET);
}
protected boolean isFilter(Object obj) {
if (obj instanceof org.eclipse.jst.javaee.web.Filter)
return true;
if (obj instanceof org.eclipse.jst.j2ee.webapplication.Filter)
return true;
return isObjectSubclassOf(obj, IServletConstants.QUALIFIED_FILTER);
}
private String getJavaClass(Object obj) {
IJavaElement jelem = getJavaElement(obj);
if (jelem == null) {
throw new IllegalArgumentException("the object parameter must be instance of IJavaElement"); //$NON-NLS-1$
}
if (jelem instanceof ICompilationUnit) {
ICompilationUnit cu = (ICompilationUnit) jelem;
jelem = getPrimaryType(cu);
}
return ((IType) jelem).getFullyQualifiedName();
}
protected String getServletClass(Object obj) {
if (obj instanceof org.eclipse.jst.javaee.web.Servlet) {
org.eclipse.jst.javaee.web.Servlet servlet = (org.eclipse.jst.javaee.web.Servlet) obj;
return servlet.getServletClass();
}
if (obj instanceof org.eclipse.jst.j2ee.webapplication.Servlet) {
org.eclipse.jst.j2ee.webapplication.Servlet servlet = (org.eclipse.jst.j2ee.webapplication.Servlet) obj;
return servlet.getServletClass().getQualifiedName();
}
return getJavaClass(obj);
}
protected String getFilterClass(Object obj) {
if (obj instanceof org.eclipse.jst.javaee.web.Filter) {
org.eclipse.jst.javaee.web.Filter filter = (org.eclipse.jst.javaee.web.Filter) obj;
return filter.getFilterClass();
}
if (obj instanceof org.eclipse.jst.j2ee.webapplication.Filter) {
org.eclipse.jst.j2ee.webapplication.Filter filter = (org.eclipse.jst.j2ee.webapplication.Filter) obj;
return filter.getFilterClass().getQualifiedName();
}
return getJavaClass(obj);
}
protected String getServletName(Object obj) {
if (obj instanceof org.eclipse.jst.javaee.web.Servlet) {
org.eclipse.jst.javaee.web.Servlet servlet = (org.eclipse.jst.javaee.web.Servlet) obj;
return servlet.getServletName();
}
if (obj instanceof org.eclipse.jst.j2ee.webapplication.Servlet) {
org.eclipse.jst.j2ee.webapplication.Servlet servlet = (org.eclipse.jst.j2ee.webapplication.Servlet) obj;
return servlet.getServletName();
}
String servletClass = getServletClass(obj);
IProject project = getJavaElement(obj).getJavaProject().getProject();
IModelProvider provider = ModelProviderManager.getModelProvider(project);
Object modelObject = provider.getModelObject();
if (modelObject instanceof org.eclipse.jst.javaee.web.WebApp) {
org.eclipse.jst.javaee.web.WebApp webApp = (org.eclipse.jst.javaee.web.WebApp) modelObject;
Iterator servlets = webApp.getServlets().iterator();
while (servlets.hasNext()) {
org.eclipse.jst.javaee.web.Servlet servlet = (org.eclipse.jst.javaee.web.Servlet) servlets.next();
String qualified = servlet.getServletClass();
if (qualified.equals(servletClass)) {
return servlet.getServletName();
}
}
} else if (modelObject instanceof org.eclipse.jst.j2ee.webapplication.WebApp) {
org.eclipse.jst.j2ee.webapplication.WebApp webApp = (org.eclipse.jst.j2ee.webapplication.WebApp) modelObject;
Iterator servlets = webApp.getServlets().iterator();
while (servlets.hasNext()) {
org.eclipse.jst.j2ee.webapplication.Servlet servlet = (org.eclipse.jst.j2ee.webapplication.Servlet) servlets.next();
String qualified = servlet.getServletClass().getQualifiedName();
if (qualified.equals(servletClass)) {
return servlet.getServletName();
}
}
}
return null;
}
protected boolean isServletJSP(Object obj) {
return getServletJSPFile(obj) != null;
}
protected String getServletJSPFile(Object obj) {
if (obj instanceof org.eclipse.jst.javaee.web.Servlet) {
org.eclipse.jst.javaee.web.Servlet servlet = (org.eclipse.jst.javaee.web.Servlet) obj;
return servlet.getJspFile();
}
if (obj instanceof org.eclipse.jst.j2ee.webapplication.Servlet) {
org.eclipse.jst.j2ee.webapplication.Servlet servlet = (org.eclipse.jst.j2ee.webapplication.Servlet) obj;
org.eclipse.jst.j2ee.webapplication.WebType webType = servlet.getWebType();
if (webType.isJspType()) {
org.eclipse.jst.j2ee.webapplication.JSPType jspType = (org.eclipse.jst.j2ee.webapplication.JSPType) webType;
return jspType.getJspFile();
}
}
return null;
}
protected boolean isWebFolder(Object obj) {
if (obj instanceof IFolder) {
return WebUtilities.isWebResource(obj);
}
return false;
}
protected boolean isJSP(Object obj) {
if (obj instanceof IFile) {
IFile file = (IFile) obj;
return WebUtilities.isWebResource(file) && file.getName().endsWith(J2EEFileUtil.DOT_JSP);
}
return false;
}
protected String getWebResourcePath(IResource resource) {
IVirtualComponent comp = ComponentCore.createComponent(resource.getProject());
if (comp != null) {
IPath rootPath = comp.getRootFolder().getWorkspaceRelativePath();
return "/" + resource.getFullPath().makeRelativeTo(rootPath).toString(); //$NON-NLS-1$
}
return null;
}
protected String makeFirstCharUppercase(String str) {
if (str == null || str.length() == 0)
return str;
StringBuilder builder = new StringBuilder(str);
builder.setCharAt(0, Character.toUpperCase(builder.charAt(0)));
return builder.toString();
}
protected String getFileNameWithouFileExtension(IFile file) {
String name = file.getName();
String ext = file.getFileExtension();
if (ext == null)
return name;
return name.substring(0, name.length() - (ext.length() + 1));
}
protected void checkExistingButton(boolean state) {
existingButton.setSelection(state);
existingButton.notifyListeners(SWT.Selection, new Event());
}
}