blob: f76e153b9cd57da214273c13b199097eb93b7797 [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.beans.addproperty;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringWriter;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptException;
import org.netbeans.api.java.source.CodeStyle;
import org.netbeans.api.java.source.CodeStyleUtils;
import org.netbeans.api.scripting.Scripting;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.util.Exceptions;
/**
*
* @author Sandip V. Chitale (Sandip.Chitale@Sun.Com)
*/
public class AddPropertyGenerator {
public String generate(AddPropertyConfig addPropertyConfig, CodeStyle cs) {
ScriptEngine scriptEngine = getScriptEngine();
if (scriptEngine != null) {
FileObject template = getTemplateFileObject(addPropertyConfig.getTEMPLATE_PATH());
if (template != null && template.isValid()) {
final String type = addPropertyConfig.getType().trim();
final String name = addPropertyConfig.getName().trim();
final String fieldName = CodeStyleUtils.addPrefixSuffix(name,
addPropertyConfig.isStatic() ? cs.getStaticFieldNamePrefix() : cs.getFieldNamePrefix(),
addPropertyConfig.isStatic() ? cs.getStaticFieldNameSuffix() : cs.getFieldNameSuffix());
final String paramName = CodeStyleUtils.addPrefixSuffix(name,
cs.getParameterNamePrefix(),
cs.getParameterNameSuffix());
final String paramIndex = CodeStyleUtils.addPrefixSuffix("index", //NOI18N
cs.getParameterNamePrefix(),
cs.getParameterNameSuffix());
final String propName = CodeStyleUtils.addPrefixSuffix(
addPropertyConfig.getPopName().trim(),
cs.getStaticFieldNamePrefix(),
cs.getStaticFieldNameSuffix());
final String initializer = addPropertyConfig.getInitializer().trim();
String access;
switch (addPropertyConfig.getAccess()) {
case PRIVATE:
access = "private "; // NOI18N
break;
case PROTECTED:
access = "protected "; // NOI18N
break;
case PUBLIC:
access = "public "; // NOI18N
break;
default:
access = "";
break;
}
ScriptContext scriptContext = scriptEngine.getContext();
StringWriter writer = new StringWriter();
scriptContext.setWriter(writer);
scriptContext.setAttribute(FileObject.class.getName(), template, ScriptContext.ENGINE_SCOPE);
scriptContext.setAttribute(ScriptEngine.FILENAME, template.getNameExt(), ScriptContext.ENGINE_SCOPE);
scriptContext.setAttribute("access", access, ScriptContext.ENGINE_SCOPE); // NOI18N
scriptContext.setAttribute("type", type, ScriptContext.ENGINE_SCOPE); // NOI18N
scriptContext.setAttribute("className", addPropertyConfig.getClassName(), ScriptContext.ENGINE_SCOPE); // NOI18N
scriptContext.setAttribute("name", name, ScriptContext.ENGINE_SCOPE); // NOI18N
scriptContext.setAttribute("fieldName", fieldName, ScriptContext.ENGINE_SCOPE); // NOI18N
scriptContext.setAttribute("paramName", paramName, ScriptContext.ENGINE_SCOPE); // NOI18N
scriptContext.setAttribute("paramIndex", paramIndex, ScriptContext.ENGINE_SCOPE); // NOI18N
scriptContext.setAttribute("initializer", initializer, ScriptContext.ENGINE_SCOPE); // NOI18N
scriptContext.setAttribute("capitalizedName", CodeStyleUtils.getCapitalizedName(name), ScriptContext.ENGINE_SCOPE); // NOI18N
scriptContext.setAttribute("getterName", CodeStyleUtils.computeGetterName(fieldName, type.equalsIgnoreCase("boolean"), addPropertyConfig.isStatic(), cs), ScriptContext.ENGINE_SCOPE); // NOI18N
scriptContext.setAttribute("setterName", CodeStyleUtils.computeSetterName(fieldName, addPropertyConfig.isStatic(), cs), ScriptContext.ENGINE_SCOPE); // NOI18N
scriptContext.setAttribute("static", Boolean.valueOf(addPropertyConfig.isStatic()), ScriptContext.ENGINE_SCOPE); // NOI18N
scriptContext.setAttribute("final", Boolean.valueOf(addPropertyConfig.isFinale()), ScriptContext.ENGINE_SCOPE); // NOI18N
AddPropertyConfig.GENERATE generateGetterSetter = addPropertyConfig.getGenerateGetterSetter();
scriptContext.setAttribute("generateGetter", // NOI18N
Boolean.valueOf(generateGetterSetter == AddPropertyConfig.GENERATE.GETTER_AND_SETTER || generateGetterSetter == AddPropertyConfig.GENERATE.GETTER),
ScriptContext.ENGINE_SCOPE);
scriptContext.setAttribute("generateSetter", // NOI18N
Boolean.valueOf(generateGetterSetter == AddPropertyConfig.GENERATE.GETTER_AND_SETTER || generateGetterSetter == AddPropertyConfig.GENERATE.SETTER),
ScriptContext.ENGINE_SCOPE);
scriptContext.setAttribute("generateJavadoc", Boolean.valueOf(addPropertyConfig.isGenerateJavadoc()), ScriptContext.ENGINE_SCOPE); // NOI18N
scriptContext.setAttribute("bound", Boolean.valueOf(addPropertyConfig.isBound()), ScriptContext.ENGINE_SCOPE); // NOI18N
scriptContext.setAttribute("PROP_NAME", propName, ScriptContext.ENGINE_SCOPE); // NOI18N
scriptContext.setAttribute("vetoable", Boolean.valueOf(addPropertyConfig.isVetoable()), ScriptContext.ENGINE_SCOPE); // NOI18N
scriptContext.setAttribute("indexed", Boolean.valueOf(addPropertyConfig.isIndexed()), ScriptContext.ENGINE_SCOPE); // NOI18N
scriptContext.setAttribute("propertyChangeSupport", addPropertyConfig.getPropertyChangeSupportName(), ScriptContext.ENGINE_SCOPE); // NOI18N
scriptContext.setAttribute("vetoableChangeSupport", addPropertyConfig.getVetoableChangeSupportName(), ScriptContext.ENGINE_SCOPE); // NOI18N
scriptContext.setAttribute("generatePropertyChangeSupport", Boolean.valueOf(addPropertyConfig.isGeneratePropertyChangeSupport()), ScriptContext.ENGINE_SCOPE); // NOI18N
scriptContext.setAttribute("generateVetoablePropertyChangeSupport", Boolean.valueOf(addPropertyConfig.isGenerateVetoableChangeSupport()), ScriptContext.ENGINE_SCOPE); // NOI18N
Reader templateReader = null;
try {
templateReader = new InputStreamReader(template.getInputStream());
scriptEngine.eval(templateReader);
return writer.toString();
} catch (ScriptException ex) {
Exceptions.printStackTrace(ex);
} catch (IOException ioe) {
Exceptions.printStackTrace(ioe);
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException ex) {
Exceptions.printStackTrace(ex);
}
}
if (templateReader != null) {
try {
templateReader.close();
} catch (IOException ex) {
Exceptions.printStackTrace(ex);
}
}
}
}
}
return "/*Error*/"; // NOI18N
}
private static FileObject getTemplateFileObject(String templatePath) {
return FileUtil.getConfigFile(templatePath);
}
private static ScriptEngine getScriptEngine() {
return Scripting.createManager().getEngineByName("freemarker"); // NOI18N
}
}