NewServiceDefinitionWizardPage.java :  » Google-tech » gig » org » eiichiro » gig » eclipse » ui » wizards » Java Open Source

Java Open Source » Google tech » gig 
gig » org » eiichiro » gig » eclipse » ui » wizards » NewServiceDefinitionWizardPage.java
/*
 * 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;
  }

}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.