blob: 67cee9522638d65648ae24b658ff64271c140217 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2003, 2004 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
/*
* Created on Apr 1, 2004
*
* To change the template for this generated file go to
* Window - Preferences - Java - Code Generation - Code and Comments
*/
package org.eclipse.jst.j2ee.internal.web.operations;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.codegen.jet.JETException;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jst.common.internal.annotations.controller.AnnotationsController;
import org.eclipse.jst.common.internal.annotations.controller.AnnotationsControllerManager;
import org.eclipse.jst.j2ee.internal.J2EEEditModel;
import org.eclipse.jst.j2ee.internal.common.operations.NewJavaClassOperation;
import org.eclipse.jst.j2ee.internal.project.WTPJETEmitter;
import org.eclipse.jst.j2ee.internal.web.plugin.WebPlugin;
import org.eclipse.wst.common.frameworks.internal.enablement.nonui.WFTWrappedException;
import org.eclipse.wst.common.frameworks.internal.operations.WTPOperationDataModel;
import org.eclipse.wst.common.internal.emfworkbench.integration.EditModel;
import com.ibm.wtp.common.logger.proxy.Logger;
/**
* @author jialin
*
* To change the template for this generated type comment go to Window - Preferences - Java - Code
* Generation - Code and Comments
*/
public class NewServletClassOperation extends NewJavaClassOperation {
protected static final String TO_STRING = "toString"; //$NON-NLS-1$
protected EditModel editModel = null;
/**
* @param dataModel
*/
public NewServletClassOperation(WTPOperationDataModel dataModel) {
super(dataModel);
//EditModel editModel =
// J2EEWebNatureRuntime.getEditModelForProject(dataModel.getTargetProject(),this);
//EditModel editModel = model.getEditModelForRead(this);
//setEditModel(editModel);
}
protected boolean implementImplementedMethod(IMethod method) {
NewServletClassDataModel model = (NewServletClassDataModel) this.operationDataModel;
String methodName = method.getElementName();
if (methodName.equals("init")) { //$NON-NLS-1$
return model.getBooleanProperty(NewServletClassDataModel.INIT);
} else if (methodName.equals("toString")) { //$NON-NLS-1$
return model.getBooleanProperty(NewServletClassDataModel.TO_STRING);
} else if (methodName.equals("getServletInfo")) { //$NON-NLS-1$
return model.getBooleanProperty(NewServletClassDataModel.GET_SERVLET_INFO);
} else if (methodName.equals("doPost")) { //$NON-NLS-1$
return model.getBooleanProperty(NewServletClassDataModel.DO_POST);
} else if (methodName.equals("doPut")) { //$NON-NLS-1$
return model.getBooleanProperty(NewServletClassDataModel.DO_PUT);
} else if (methodName.equals("doDelete")) { //$NON-NLS-1$
return model.getBooleanProperty(NewServletClassDataModel.DO_DELETE);
} else if (methodName.equals("destroy")) { //$NON-NLS-1$
return model.getBooleanProperty(NewServletClassDataModel.DESTROY);
} else if (methodName.equals("doGet")) { //$NON-NLS-1$
return model.getBooleanProperty(NewServletClassDataModel.DO_GET);
}
return false;
}
protected String getUserDefinedMethodStubs(IType superClassType) {
// toString method is not found in the getMethods of the
// IType and hence extra handling is needed to generate toString()
return generateToString(superClassType);
}
private String generateToString(IType superClassType) {
StringBuffer sb = new StringBuffer();
NewServletClassDataModel model = (NewServletClassDataModel) this.operationDataModel;
if (model.getBooleanProperty(NewServletClassDataModel.TO_STRING)) {
try {
IMethod[] methods = superClassType.getMethods();
// check whether toString is already generated
for (int j = 0; j < methods.length; j++) {
IMethod method = methods[j];
if (method.getElementName().equals(TO_STRING))
return EMPTY_STRING;
}
// generate stub for toString method
String name = TO_STRING;
// Java doc
sb.append("\t/* (non-Java-doc)"); //$NON-NLS-1$
sb.append(lineSeparator);
sb.append("\t * @see "); //$NON-NLS-1$
sb.append(JAVA_LANG_OBJECT + POUND + name + OPEN_PAR);
sb.append(CLOSE_PAR);
sb.append(lineSeparator);
sb.append("\t */"); //$NON-NLS-1$
sb.append(lineSeparator);
// access
sb.append(TAB);
sb.append(PUBLIC);
// return type
String returnType = "String"; //$NON-NLS-1$
sb.append(returnType);
sb.append(SPACE);
// name
sb.append(name);
// Parameters
sb.append(OPEN_PAR + CLOSE_PAR);
sb.append(SPACE + OPEN_BRA);
sb.append(lineSeparator);
// method body
sb.append(TODO_COMMENT);
sb.append(lineSeparator);
sb.append(RETURN_NULL);
sb.append(lineSeparator);
// method body end
sb.append(TAB + CLOSE_BRA);
sb.append(lineSeparator);
sb.append(lineSeparator);
} catch (JavaModelException e) {
Logger.getLogger().log(e);
}
}
return sb.toString();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.wst.common.frameworks.internal.operation.WTPOperation#execute(org.eclipse.core.runtime.IProgressMonitor)
*/
protected void execute(IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException {
IFolder sourceFolder = createJavaSourceFolder();
IPackageFragment pack = createJavaPackage();
// if using annotations
if (((NewServletClassDataModel) getOperationDataModel()).isAnnotated())
generateUsingTemplates(monitor, pack);
else
createJavaFile(sourceFolder, pack);
}
/**
* @param monitor
*/
private void generateUsingTemplates(IProgressMonitor monitor, IPackageFragment fragment) throws WFTWrappedException, CoreException {
CreateServletTemplateModel tempModel = createTemplateModel();
String source;
try {
source = generateTemplateSource(tempModel, monitor);
} catch (JETException e) {
throw new WFTWrappedException(e);
}
if (fragment != null) {
String javaFileName = tempModel.getServletClassName() + ".java"; //$NON-NLS-1$
ICompilationUnit cu = fragment.getCompilationUnit(javaFileName);
if (cu == null || !cu.exists())
cu = fragment.createCompilationUnit(javaFileName, source, true, monitor);
IFile aFile = (IFile) cu.getResource();
AnnotationsController controller = AnnotationsControllerManager.INSTANCE.getAnnotationsController(this.editModel.getProject());
if (controller != null)
controller.process(aFile);
((J2EEEditModel)this.editModel).getWorkingCopy(cu, true); //Track CU.
}
}
private String generateTemplateSource(CreateServletTemplateModel tempModel, IProgressMonitor monitor) throws JETException {
String templateURI = "platform:/plugin/" + WebPlugin.PLUGIN_ID + "/templates/" + getTemplateFileName(); //$NON-NLS-1$ //$NON-NLS-2$
WTPJETEmitter emitter = new WTPJETEmitter(templateURI, this.getClass().getClassLoader());
emitter.setIntelligentLinkingEnabled(true);
emitter.addVariable("WEB_PLUGIN", WebPlugin.PLUGIN_ID); //$NON-NLS-1$
return emitter.generate(monitor, new Object[]{tempModel});
}
protected CreateServletTemplateModel createTemplateModel() {
CreateServletTemplateModel model = new CreateServletTemplateModel((NewServletClassDataModel) getOperationDataModel());
return model;
}
protected String getTemplateFileName() {
return "servletXDoclet.javajet"; //$NON-NLS-1$
}
/**
* @param editModel
* The editModel to set.
*/
public void setEditModel(EditModel editModel) {
this.editModel = editModel;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.wst.common.frameworks.internal.operation.WTPOperation#dispose(org.eclipse.core.runtime.IProgressMonitor)
*/
protected void dispose(IProgressMonitor pm) {
//if (editModel != null)
// editModel.releaseAccess(this);
super.dispose(pm);
}
}