/*
* Copyright (C) 2010 Eiichiro Uchiumi. All Rights Reserved.
*
* Licensed 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.eiichiro.gig.eclipse.ui.wizards;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.ITypeHierarchy;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.Signature;
import org.eclipse.jdt.internal.ui.dialogs.StatusInfo;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.LayoutUtil;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.SelectionButtonDialogFieldGroup;
import org.eclipse.jdt.ui.CodeGeneration;
import org.eclipse.jdt.ui.wizards.NewTypeWizardPage;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
/**
* {@code NewServiceDefinitionWizardPage}
*
* @author <a href="mailto:eiichiro@eiichiro.org">Eiichiro Uchiumi</a>
*/
@SuppressWarnings("restriction")
public class NewServiceDefinitionWizardPage extends NewTypeWizardPage {
private SelectionButtonDialogFieldGroup stubsFieldGroup;
private NewServiceDefinitionOptionsWizardPage page2;
public NewServiceDefinitionWizardPage(NewServiceDefinitionOptionsWizardPage page2) {
super(true, "NewServiceDefinitionWizardPage");
setTitle("Service Definition");
setDescription("Create a new Service definition class.");
String[] stubTexts = {
"&Constructors from superclass",
"In&herited abstract methods"
};
stubsFieldGroup = new SelectionButtonDialogFieldGroup(SWT.CHECK, stubTexts, 1);
stubsFieldGroup.setLabelText("Which method stubs would you like to create?");
this.page2 = page2;
}
public void init(IStructuredSelection selection) {
IJavaElement element = getInitialJavaElement(selection);
initContainerPage(element);
initTypePage(element);
setSuperClass("org.eiichiro.jazzmaster.service.Service", true);
updateStatus(getStatusList());
}
/* (non-Javadoc)
* @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
*/
@Override
public void createControl(Composite parent) {
initializeDialogUnits(parent);
Composite composite = new Composite(parent, SWT.NONE);
composite.setFont(parent.getFont());
int nColumns = 4;
GridLayout layout = new GridLayout();
layout.numColumns = nColumns;
composite.setLayout(layout);
createContainerControls(composite, nColumns);
createPackageControls(composite, nColumns);
createSeparator(composite, nColumns);
createTypeNameControls(composite, nColumns);
createModifierControls(composite, nColumns);
createSuperClassControls(composite, nColumns);
createSuperInterfacesControls(composite, nColumns);
createMethodStubSelectionControls(composite, nColumns);
createCommentControls(composite, nColumns);
enableCommentControl(true);
setControl(composite);
Dialog.applyDialogFont(composite);
// TODO: Help.
}
private void createMethodStubSelectionControls(Composite composite,
int nColumns) {
Control labelControl = stubsFieldGroup.getLabelControl(composite);
LayoutUtil.setHorizontalSpan(labelControl, nColumns);
DialogField.createEmptySpace(composite);
Control buttonGroup = stubsFieldGroup.getSelectionButtonsGroup(composite);
LayoutUtil.setHorizontalSpan(buttonGroup, nColumns - 1);
}
@Override
protected void createTypeMembers(IType newType, ImportsManager imports,
IProgressMonitor monitor) throws CoreException {
boolean doConstr = isCreateConstructors();
boolean doInherited = isCreateInherited();
createInheritedMethods(newType, doConstr, doInherited, imports,
new SubProgressMonitor(monitor, 1));
createGetImplementation(newType, imports);
createGetName(newType, imports);
createGetScope(newType, imports);
createGetInterfaces(newType, imports);
createGetProperties(newType, imports);
createGetBindings(newType, imports);
createGetProvider(newType, imports);
createGetInterceptors(newType, imports);
createGetStages(newType, imports);
createGetCallbacks(newType, imports);
}
private boolean isCreateConstructors() {
return stubsFieldGroup.isSelected(0);
}
private boolean isCreateInherited() {
return stubsFieldGroup.isSelected(1);
}
private void createGetImplementation(IType newType, ImportsManager imports)
throws CoreException {
if (page2.getImplementationSelected()) {
StringBuilder builder = new StringBuilder();
String comment = CodeGeneration.getMethodComment(
newType.getCompilationUnit(), getTypeName(),
"getImplementation", new String[0], new String[0],
Signature.createTypeSignature("java.lang.Class", true),
null, "\n");
if (comment != null) {
builder.append(comment);
builder.append("\n");
}
builder.append("@Override\n");
builder.append("public Class<?> getImplementation() {\n");
builder.append("// TODO: Return the service implementation class.\n");
builder.append("// If you override 'getProvider()' method, you may "
+ "return null in this method.\n");
builder.append("return null;\n");
builder.append("}\n");
newType.createMethod(builder.toString(), null, false, null);
}
}
private void createGetName(IType newType, ImportsManager imports)
throws CoreException {
if (page2.getNameSelected()) {
StringBuilder builder = new StringBuilder();
String comment = CodeGeneration.getMethodComment(
newType.getCompilationUnit(), getTypeName(),
"getName", new String[0], new String[0],
Signature.createTypeSignature("java.lang.String", true),
null, "\n");
if (comment != null) {
builder.append(comment);
builder.append("\n");
}
builder.append("@Override\n");
builder.append("public String getName() {\n");
builder.append("// TODO: Return the service name.\n");
builder.append("return super.getName();\n");
builder.append("}\n");
newType.createMethod(builder.toString(), null, false, null);
}
}
private void createGetScope(IType newType, ImportsManager imports)
throws CoreException {
if (page2.getScopeSelected()) {
StringBuilder builder = new StringBuilder();
String comment = CodeGeneration.getMethodComment(
newType.getCompilationUnit(), getTypeName(),
"getScope", new String[0], new String[0],
Signature.createTypeSignature(
imports.addImport("org.eiichiro.jazzmaster.management.Scope"),
true),
null, "\n");
if (comment != null) {
builder.append(comment);
builder.append("\n");
}
builder.append("@Override\n");
builder.append("public Scope getScope() {\n");
builder.append("// TODO: Return the scope to activate this service.\n");
builder.append("return super.getScope();\n");
builder.append("}\n");
newType.createMethod(builder.toString(), null, false, null);
}
}
private void createGetInterfaces(IType newType, ImportsManager imports)
throws CoreException {
if (page2.getInterfacesSelected()) {
StringBuilder builder = new StringBuilder();
imports.addImport("java.util.Set");
String comment = CodeGeneration.getMethodComment(
newType.getCompilationUnit(), getTypeName(),
"getInterfaces", new String[0], new String[0],
Signature.createTypeSignature("Set<Class<?>>", true),
null, "\n");
if (comment != null) {
builder.append(comment);
builder.append("\n");
}
builder.append("@Override\n");
builder.append("public Set<Class<?>> getInterfaces() {\n");
builder.append("// TODO: Return the list of interface to expose this service.\n");
builder.append("return super.getInterfaces();\n");
builder.append("}\n");
newType.createMethod(builder.toString(), null, false, null);
}
}
private void createGetProperties(IType newType, ImportsManager imports)
throws CoreException {
if (page2.getPropertiesSelected()) {
StringBuilder builder = new StringBuilder();
imports.addImport("java.util.Set");
imports.addImport("org.eiichiro.jazzmaster.kernel.Property");
String comment = CodeGeneration.getMethodComment(
newType.getCompilationUnit(), getTypeName(),
"getProperties", new String[0], new String[0],
Signature.createTypeSignature("Set<Property<?>>", true),
null, "\n");
if (comment != null) {
builder.append(comment);
builder.append("\n");
}
builder.append("@Override\n");
builder.append("public Set<Property<?>> getProperties() {\n");
builder.append("// TODO: Return the set view of property to assemble this service.\n");
builder.append("return super.getProperties();\n");
builder.append("}\n");
newType.createMethod(builder.toString(), null, false, null);
}
}
private void createGetBindings(IType newType, ImportsManager imports)
throws CoreException {
if (page2.getBindingsSelected()) {
StringBuilder builder = new StringBuilder();
imports.addImport("java.util.Set");
imports.addImport("java.lang.annotation.Annotation");
String comment = CodeGeneration.getMethodComment(
newType.getCompilationUnit(), getTypeName(),
"getBindings", new String[0], new String[0],
Signature.createTypeSignature("Set<Annotation>", true),
null, "\n");
if (comment != null) {
builder.append(comment);
builder.append("\n");
}
builder.append("@Override\n");
builder.append("public Set<Annotation> getBindings() {\n");
builder.append("// TODO: Return the set view of binding annotation "
+ "to qualify this service.\n");
builder.append("return super.getBindings();\n");
builder.append("}\n");
newType.createMethod(builder.toString(), null, false, null);
}
}
private void createGetProvider(IType newType, ImportsManager imports)
throws CoreException {
if (page2.getProviderSelected()) {
StringBuilder builder = new StringBuilder();
imports.addImport("org.eiichiro.jazzmaster.service.Provider");
String comment = CodeGeneration.getMethodComment(
newType.getCompilationUnit(), getTypeName(),
"getProvider", new String[0], new String[0],
Signature.createTypeSignature("Provider", true),
null, "\n");
if (comment != null) {
builder.append(comment);
builder.append("\n");
}
builder.append("@Override\n");
builder.append("public <S> Provider<S> getProvider() {\n");
builder.append("// TODO: Return the provider of this service instance.\n");
builder.append("return super.getProvider();\n");
builder.append("}\n");
newType.createMethod(builder.toString(), null, false, null);
}
}
private void createGetInterceptors(IType newType, ImportsManager imports)
throws CoreException {
if (page2.getInterceptorsSelected()) {
StringBuilder builder = new StringBuilder();
imports.addImport("java.util.List");
imports.addImport("java.lang.reflect.Method");
String comment = CodeGeneration.getMethodComment(
newType.getCompilationUnit(), getTypeName(),
"getInterceptors", new String[] {"method"}, new String[0],
Signature.createTypeSignature("List<Class<?>>", true),
null, "\n");
if (comment != null) {
builder.append(comment);
builder.append("\n");
}
builder.append("@Override\n");
builder.append("public List<Class<?>> getInterceptors(Method method) {\n");
builder.append("// TODO: Return the list view of service interceptor "
+ "to intercept the specified service method.\n");
builder.append("return super.getInterceptors(method);\n");
builder.append("}\n");
newType.createMethod(builder.toString(), null, false, null);
}
}
private void createGetStages(IType newType, ImportsManager imports)
throws CoreException {
if (page2.getStagesSelected()) {
StringBuilder builder = new StringBuilder();
imports.addImport("java.util.Set");
imports.addImport("org.eiichiro.jazzmaster.deployment.Stage");
String comment = CodeGeneration.getMethodComment(
newType.getCompilationUnit(), getTypeName(),
"getStages", new String[0], new String[0],
Signature.createTypeSignature("Set<Stage>", true),
null, "\n");
if (comment != null) {
builder.append(comment);
builder.append("\n");
}
builder.append("@Override\n");
builder.append("public Set<Stage> getStages() {\n");
builder.append("// TODO: Return deployment stages this service "
+ "implementation instance is deployed.\n");
builder.append("return super.getStages();\n");
builder.append("}\n");
newType.createMethod(builder.toString(), null, false, null);
}
}
private void createGetCallbacks(IType newType, ImportsManager imports)
throws CoreException {
if (page2.getCallbacksSelected()) {
StringBuilder builder = new StringBuilder();
imports.addImport("java.util.Set");
imports.addImport("java.lang.reflect.Method");
imports.addImport("org.eiichiro.jazzmaster.management.Lifecycle");
String comment = CodeGeneration.getMethodComment(
newType.getCompilationUnit(), getTypeName(),
"getCallbacks", new String[] {"lifecycle"}, new String[0],
Signature.createTypeSignature("Set<Method>", true),
null, "\n");
if (comment != null) {
builder.append(comment);
builder.append("\n");
}
builder.append("@Override\n");
builder.append("public Set<Method> getCallbacks(Lifecycle lifecycle) {\n");
builder.append("// TODO: Return callback methods corresponding to "
+ "the specified lifecycle.\n");
builder.append("return super.getCallbacks(lifecycle);\n");
builder.append("}\n");
newType.createMethod(builder.toString(), null, false, null);
}
}
@Override
protected IStatus superClassChanged() {
IStatus status = super.superClassChanged();
if (!status.isOK()) {
return status;
} else if (getSuperClass().equals("org.eiichiro.jazzmaster.service.Service")) {
return status;
} else {
IJavaProject project = getJavaProject();
try {
IType type = project.findType(getSuperClass());
if (type == null) {
return new StatusInfo(IStatus.ERROR, "Super class "
+ getSuperClass() + " does not exist.");
} else {
ITypeHierarchy hierarchy = type.newSupertypeHierarchy(
new NullProgressMonitor());
boolean found = false;
for (IType supertype : hierarchy.getAllClasses()) {
if (supertype.getFullyQualifiedName().equals(
"org.eiichiro.jazzmaster.service.Service")) {
found = true;
break;
}
}
if (!found) {
return new StatusInfo(IStatus.ERROR,
"Super class must be "
+ "org.eiichiro.jazzmaster.service.Service "
+ "or its subtype.");
}
}
} catch (JavaModelException e) {}
return status;
}
}
@Override
protected void handleFieldChanged(String fieldName) {
super.handleFieldChanged(fieldName);
updateStatus(getStatusList());
}
private IStatus[] getStatusList() {
IStatus[] status = {
fContainerStatus,
(isEnclosingTypeSelected()) ? fEnclosingTypeStatus : fPackageStatus,
fTypeNameStatus,
fModifierStatus,
fSuperClassStatus,
fSuperInterfacesStatus
};
return status;
}
}
|