/*******************************************************************************
* Copyright (c) 2011 GigaSpaces Technologies Ltd. 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.cloudifysource.dsl.internal;
import java.io.File;
import java.io.IOException;
/*********
* Various utility functions used during DSL processing.
* @author barakme
*
*/
public final class DSLUtils {
/**
* The context property set in application DSL files to indicate the directory where the application file itself can
* be found.
*/
public static final String APPLICATION_DIR = "workDirectory";
/**
* The binding variable name of the DSL object properties.
*/
public static final String DSL_PROPERTIES = "dsl_properties";
/**
* The binding variable name of the DSL file path - the path where the DSL file itself can be found.
*/
public static final String DSL_FILE_PATH_PROPERTY_NAME = "dslFilePath";
/**
* The binding variable name of debug all flag.
*/
public static final String DSL_DEBUG_ALL = "dslDebugAll";
/**
* The binding variable name of the validateObject flag - indicates if need to validate the DSL file.
*/
public static final String DSL_VALIDATE_OBJECTS_PROPERTY_NAME = "validateObjectsFlag";
/************
* Default file name suffix for application files.
*/
public static final String APPLICATION_DSL_FILE_NAME_SUFFIX = DSLUtils.APPLICATION_FILE_NAME_SUFFIX + ".groovy";
/**
* The expected file suffix for properties file.
*/
public static final String PROPERTIES_FILE_SUFFIX = ".properties";
/**
* The expected file suffix for overrides file.
*/
public static final String OVERRIDES_FILE_SUFFIX = ".overrides";
/**************
* Default file name suffix for cloud files.
*/
public static final String CLOUD_DSL_FILE_NAME_SUFFIX = "-cloud.groovy";
/**
* The expected file name suffix for application files e.g. <code>*-application.groovy</code>.
*/
public static final String APPLICATION_FILE_NAME_SUFFIX = "-application";
/*********
* Default file name suffix for service files.
*/
public static final String SERVICE_DSL_FILE_NAME_SUFFIX = "-service.groovy";
/**
* The expected file name suffix for service properties file e.g. <code>*-service.properties</code>.
*/
public static final String SERVICE_PROPERTIES_FILE_NAME_SUFFIX = "-service.properties";
/**
* The expected file name suffix for service overrides file e.g. <code>*-service.overrides</code>.
*/
public static final String SERVICE_OVERRIDES_FILE_NAME_SUFFIX = "-service.overrides";
/**
* Default file name suffix for template files.
*/
public static final String TEMPLATE_FILE_NAME_SUFFIX = "-template";
/**
* The expected file name suffix for templates file e.g. <code>*-templates.groovy</code>.
*/
public static final String TEMPLATE_DSL_FILE_NAME_SUFFIX = "-template.groovy";
/**
* The expected file name suffix for templates properties file e.g. <code>*-templates.properties</code>.
*/
public static final String TEMPLATES_PROPERTIES_FILE_NAME_SUFFIX = "-template.properties";
/**
* The expected file name suffix for templates overrides file e.g. <code>*-templates.overrides</code>.
*/
public static final String TEMPLATES_OVERRIDES_FILE_NAME_SUFFIX = "-template.overrides";
/**
* The expected file name of an application properties file after it has been copied to a service directory.
*/
public static final String APPLICATION_PROPERTIES_FILE_NAME = "application.properties";
/**
* The expected file name of an application overrides file after it has been copied to a service directory.
*/
public static final String APPLICATION_OVERRIDES_FILE_NAME = "application.overrides";
/**
* The max number of templates allowed in one templates file.
*/
public static final int MAX_TEMPLATES_PER_FILE = 1;
private DSLUtils() {
// private constructor to prevent initialization
}
// /**
// *
// * @param processingUnit
// * processingUnit
// * @return the dependencies
// */
// public static String getDependencies(final InternalProcessingUnit processingUnit) {
// final String dependencies = getContextPropertyValue(
// processingUnit, CloudifyConstants.CONTEXT_PROPERTY_DEPENDS_ON);
// if (dependencies == null) {
// return "";
// }
// return dependencies;
// }
//
// /**
// *
// * @param processingUnit
// * processingUnit
// * @return The tier type
// */
// public static ServiceTierType getTierType(final InternalProcessingUnit processingUnit) {
// final String tierTypeStr = getContextPropertyValue(
// processingUnit, CloudifyConstants.CONTEXT_PROPERTY_SERVICE_TYPE);
// if (tierTypeStr == null) {
// return ServiceTierType.UNDEFINED;
// }
// return ServiceTierType.valueOf(tierTypeStr);
// }
//
// /**
// *
// * @param processingUnit
// * processingUnit
// * @return The icon url
// */
// public static String getIconUrl(final InternalProcessingUnit processingUnit) {
// final String iconUrlStr = getContextPropertyValue(
// processingUnit, CloudifyConstants.CONTEXT_PROPERTY_SERVICE_ICON);
// if (iconUrlStr == null) {
// return "";
// }
// return iconUrlStr;
// }
//
// private static String getContextPropertyValue(final InternalProcessingUnit processingUnit,
// final String contextPropertyKey) {
// final String value = processingUnit.getBeanLevelProperties().getContextProperties().getProperty(
// contextPropertyKey);
// return value;
// }
/**
* If dsl file name is tomcat-service.groovy than the properties file name expected to be tomcat-service.properties.
*
* @param dslDirectory
* .
* @param fileNameSuffix
* .
* @return The expected properties file name.
*/
public static String getPropertiesFileName(final File dslDirectory, final String fileNameSuffix) {
File dslFile = DSLReader.
findDefaultDSLFile(fileNameSuffix, dslDirectory);
if (dslFile == null) {
throw new IllegalArgumentException("DslUtils.getPropertiesFileName - a file with the given suffix ["
+ fileNameSuffix + "] doesn't exist in " + dslDirectory + ".");
}
final String[] split = dslFile.getName().split("\\.");
if (split.length == 0) {
throw new IllegalArgumentException("DslUtils.getPropertiesFileName - file name ["
+ dslFile.getName() + "] doesn't contain '.'");
}
return split[0] + PROPERTIES_FILE_SUFFIX;
}
/**
* Find the file with the suffix -service.groovy in dslDirectory.
* If the groovy file name is tomcat-service.groovy than return new file with name 'tomcat-service.properties'
* @param dslDirectory
* @return The created properties file.
*/
public static File getPropertiesFile(final File dslDirectory) {
File dslFile = DSLReader.
findDefaultDSLFile(DSLUtils.SERVICE_DSL_FILE_NAME_SUFFIX, dslDirectory);
String groovyFileName = dslFile.getName();
String dslName = groovyFileName.substring(0, groovyFileName.indexOf(DSLUtils.SERVICE_DSL_FILE_NAME_SUFFIX));
return new File(dslDirectory, dslName + DSLUtils.SERVICE_PROPERTIES_FILE_NAME_SUFFIX);
}
/**
* Change the name of the file's prefix to template's name.
*
* @param file
* the template's file.
* @param templateName
* the template's name.
* @param suffix
* the file suffix (-template.groovy/-template.properties/-template.overrides)
* @return returns the new name if the renaming needed and succeeded.
* @throws IOException
* if failed to rename the file.
*/
public static String renameCloudTemplateFileNameIfNeeded(final File file, final String templateName,
final String suffix)
throws IOException {
String fileName = file.getName();
if (fileName.endsWith(suffix)) {
String newName = templateName + suffix;
if (!fileName.equals(newName)) {
File parent = file.getParentFile();
File newNameFile = new File(parent, newName);
boolean renamed = file.renameTo(newNameFile);
if (!renamed) {
throw new IOException("Failed to rename template file " + file.getAbsolutePath()
+ " to " + newNameFile.getName());
}
return newName;
}
}
return null;
}
/**
* Checks if the given name contains chars that are invalid for Application or Service name.
*
* @param name
* the Application or Service name to validate.
* @throws DSLValidationException
* if the name if not valid.
*/
public static void validateRecipeName(final String name) throws DSLValidationException {
char[] invalidChars = new char[] { '{', '}', '[', ']', '(', ')' };
if (org.apache.commons.lang.StringUtils.containsAny(name, invalidChars)) {
throw new DSLValidationException("The name \"" + name + "\" contains one or more invalid characters: "
+ "'(',')','[',']','{','}'");
}
}
}