/*
* Copyright 2015 JBoss, by Red Hat, Inc
*
* 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.uberfire.ext.plugin.backend;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.uberfire.ext.plugin.model.CodeType;
import org.uberfire.ext.plugin.model.Framework;
import org.uberfire.ext.plugin.model.PluginSimpleContent;
import org.uberfire.ext.plugin.model.PluginType;
public class JSRegistry {
public static String convertToJSRegistry(PluginSimpleContent plugin) {
Gson gson = new GsonBuilder().setPrettyPrinting().create();
final StringBuilder sb = new StringBuilder();
if (plugin.getCodeMap().containsKey(CodeType.MAIN)) {
sb.append(plugin.getCodeMap().get(CodeType.MAIN));
}
if (plugin.getType().equals(PluginType.SCREEN)) {
sb.append("$registerPlugin({");
} else if (plugin.getType().equals(PluginType.SPLASH)) {
sb.append("$registerSplashScreen({");
} else if (plugin.getType().equals(PluginType.EDITOR)) {
sb.append("$registerEditor({");
} else if (plugin.getType().equals(PluginType.PERSPECTIVE)) {
sb.append("$registerPerspective({");
}
sb.append("id:").append('"').append(plugin.getName()).append('"').append(",");
if (plugin.getCodeMap().size() > 1) {
//Order Code fragments in the same sequence as defined in the CodeType enum, to aid repeatable testing
for (CodeType ct : CodeType.values()) {
if (ct.equals(CodeType.MAIN)) {
continue;
}
if (plugin.getCodeMap().containsKey(ct)) {
sb.append(ct.toString().toLowerCase()).append(": ");
sb.append(prepareEntryValue(ct,
plugin.getCodeMap().get(ct))).append(",");
}
}
}
if (plugin.getFrameworks() != null && !plugin.getFrameworks().isEmpty()) {
final Framework fm = plugin.getFrameworks().iterator().next();
sb.append("type: ").append('"').append(fm.getType()).append('"').append(',');
}
if (!plugin.getType().equals(PluginType.PERSPECTIVE)) {
sb.append("template: ");
gson.toJson(plugin.getTemplate(),
sb);
} else {
sb.append("view: {").append(plugin.getTemplate()).append("}");
}
sb.append("});");
return sb.toString();
}
protected static String prepareEntryValue(CodeType key,
String value) {
if (isAFunction(value)) {
return value;
} else {
return prepareStringValue(key,
value);
}
}
private static boolean isAFunction(String value) {
return value != null && value.contains("function");
}
private static String prepareStringValue(CodeType key,
String value) {
return wrapWithFunctionDeclaration(key,
value);
}
private static String wrapWithFunctionDeclaration(CodeType key,
String value) {
StringBuilder sb = new StringBuilder();
sb.append("function (){");
sb.append(createFunctionBody(key,
value));
sb.append(";}");
return sb.toString();
}
private static String createFunctionBody(CodeType key,
String value) {
StringBuilder sb = new StringBuilder();
if (JSFunctionNeedsToReturnValue(key)) {
sb.append("return ");
sb.append(wrapValueWithCommas(value));
} else {
sb.append(value);
}
return sb.toString();
}
private static String wrapValueWithCommas(String value) {
StringBuilder sb = new StringBuilder();
if (value == null || value.isEmpty()) {
sb.append("\"\"");
} else {
if (value.charAt(0) != '"') {
sb.append("\"");
}
sb.append(value);
if (value.charAt(value.length() - 1) != '"') {
sb.append("\"");
}
}
return sb.toString();
}
public static boolean JSFunctionNeedsToReturnValue(CodeType codeType) {
return codeType.equals(CodeType.TITLE) ||
codeType.equals(CodeType.RESOURCE_TYPE) ||
codeType.equals(CodeType.PRIORITY) ||
codeType.equals(CodeType.BODY_HEIGHT) ||
codeType.equals(CodeType.INTERCEPTION_POINTS) ||
codeType.equals(CodeType.PANEL_TYPE);
}
}