/* * Copyright 2010-2011 Research In Motion Limited. * * 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 net.rim.tumbler.serialize; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.Vector; import java.util.regex.Pattern; import net.rim.tumbler.config.WidgetAccess; import net.rim.tumbler.config.WidgetConfig; import net.rim.tumbler.config.WidgetFeature; import net.rim.tumbler.file.TemplateFile; public class WidgetConfig_v1Serializer implements WidgetConfigSerializer { private static final String NL = System.getProperty("line.separator"); private static final String TAB = " "; private static final String NL_LVL_0 = NL + TAB + TAB; private static final String NL_LVL_1 = NL + TAB + TAB + TAB; private static final String NL_LVL_2 = NL + TAB + TAB + TAB + TAB; private static final String NL_LVL_3 = NL + TAB + TAB + TAB + TAB + TAB; private static final String NL_LVL_4 = NL + TAB + TAB + TAB + TAB + TAB + TAB; private static final String NL_LVL_5 = NL + TAB + TAB + TAB + TAB + TAB + TAB + TAB; private static final String AUTOGEN_HEADER = "///" + "/// AUTO-GENERATED CLASS FROM WEB COMPONENT PACK - edit with caution" + NL + "///" + NL + NL + "/*" + NL + " * WidgetConfigAutoGen.java" + NL + " *" + NL + " * � Research In Motion Limited, 2009-2011" + NL + " * Confidential and proprietary." + NL + " */" + NL + "package blackberry.web.widget.autogen;" + NL + "import blackberry.web.widget.impl.WidgetConfigImpl;" + NL + "import blackberry.web.widget.loadingScreen.TransitionConstants;" + NL + "import net.rim.device.api.web.WidgetAccess;" + NL + "import net.rim.device.api.web.WidgetConfig;" + NL + "import net.rim.device.api.web.WidgetFeature;" + NL + "import net.rim.device.api.io.transport.TransportInfo;" + NL + "import java.util.Hashtable;" + NL + "/*" + NL + " * see blackberry.web.widget.WidgetConfig" + NL + " */" + NL + "public final class WidgetConfigAutoGen extends WidgetConfigImpl {" + NL + " public WidgetConfigAutoGen() {" + NL; private WidgetConfig _widgetConfig; public WidgetConfig_v1Serializer(WidgetConfig widgetConfig) { _widgetConfig = widgetConfig; } public byte[] serialize() { StringBuilder buffer = new StringBuilder(); Map<String, String> memberMap = new HashMap<String, String>(); // Populate the basic members // Special characters for Java source file: escape /, ", ' for Java source memberMap.put("_id", _widgetConfig.getID()); memberMap.put("_name", _widgetConfig.getName()); memberMap.put("_description", _widgetConfig.getDescription()); memberMap.put("_content", _widgetConfig.getContent()); memberMap.put("_configXML", _widgetConfig.getConfigXML()); memberMap.put("_backButtonBehaviour", _widgetConfig.getBackButtonBehaviour()); memberMap.put("_contentType", _widgetConfig.getContentType()); memberMap.put("_contentCharset", _widgetConfig.getContentCharSet()); memberMap.put("_license", _widgetConfig.getLicense()); memberMap.put("_licenseURL", _widgetConfig.getLicenseURL()); memberMap.put("_author", _widgetConfig.getAuthor()); memberMap.put("_copyright", _widgetConfig.getCopyright()); memberMap.put("_authorEmail", _widgetConfig.getAuthorEmail()); memberMap.put("_loadingScreenColor", _widgetConfig.getLoadingScreenColour()); memberMap.put("_backgroundImage", _widgetConfig.getBackgroundImage()); memberMap.put("_foregroundImage", _widgetConfig.getForegroundImage()); memberMap.put("_authorURL", _widgetConfig.getAuthorURL()); memberMap.put("_backgroundSource", _widgetConfig.getBackgroundSource()); memberMap.put("_foregroundSource", _widgetConfig.getForegroundSource()); buffer.append(TemplateFile.refactor(AUTOGEN_HEADER)); Set<Entry<String, String>> entrySet = memberMap.entrySet(); // Iterate memberMap for (Entry< String, String > entry : entrySet) { String value = entry.getValue(); if (value != null) { buffer.append(entry.getKey()).append(" = \""); buffer.append(escapeSpecialCharacterForJavaSource(value)); buffer.append("\";").append(NL_LVL_0); } } // * present if (_widgetConfig.allowMultiAccess()) { buffer.append("_hasMultiAccess = true;").append(NL_LVL_0); } // Add icons if (_widgetConfig.getIconSrc().size() > 0) { buffer.append("_icon = \"").append(_widgetConfig.getIconSrc().firstElement()) .append("\";").append(NL_LVL_0); if (_widgetConfig.getHoverIconSrc().size() > 0) { buffer.append("_iconHover = \"") .append(_widgetConfig.getHoverIconSrc().firstElement()) .append("\";").append(NL_LVL_0); } } // Add custom headers for( String key : _widgetConfig.getCustomHeaders().keySet()) { buffer.append("_customHeaders.addProperty(").append(NL_LVL_0); buffer.append("\"").append(key).append("\"," + NL_LVL_1); buffer.append("\"").append(escapeSpecialCharacterForJavaSource(_widgetConfig.getCustomHeaders().get(key))) .append("\");").append(NL_LVL_1); } // Set navigation mode if (_widgetConfig.getNavigationMode()) { buffer.append("_widgetNavigationMode = true;").append(NL_LVL_0); } // Set orientation if (_widgetConfig.getOrientationDefined()) { buffer.append("_orientationDefined = true;").append(NL_LVL_0); buffer.append("_orientation = " + Integer.toString(_widgetConfig.getOrientation()) + ";").append(NL_LVL_0); } // Add LoadingScreen configuration if (_widgetConfig.getFirstPageLoad()) { buffer.append("_firstPageLoad = true;").append(NL_LVL_0); } if (_widgetConfig.getRemotePageLoad()) { buffer.append("_remotePageLoad = true;").append(NL_LVL_0); } if (_widgetConfig.getLocalPageLoad()) { buffer.append("_localPageLoad = true;").append(NL_LVL_0); } // Add TransitionEffect configuration if (_widgetConfig.getTransitionType() != null) { buffer.append("_transitionType = ").append(_widgetConfig.getTransitionType()) .append(";").append(NL_LVL_0); if (_widgetConfig.getTransitionDuration() >= 0) { buffer.append("_transitionDuration = ") .append(_widgetConfig.getTransitionDuration()) .append(";").append(NL_LVL_0); } if (_widgetConfig.getTransitionDirection() != null) { buffer.append("_transitionDirection = ") .append(_widgetConfig.getTransitionDirection()) .append(";").append(NL_LVL_0); } } // Add cache options if (_widgetConfig.isCacheEnabled() != null) { buffer.append("_cacheEnabled = ").append(_widgetConfig.isCacheEnabled()) .append(";").append(NL_LVL_0); } if (_widgetConfig.getAggressiveCacheAge() != null) { // Enable aggressive caching if applicable if(_widgetConfig.isAggressiveCacheEnabled()!=null) { buffer.append("_aggressivelyCaching = ") .append(_widgetConfig.isAggressiveCacheEnabled()).append(";") .append(NL_LVL_0); } buffer.append("_aggressiveCacheAge = ") .append(_widgetConfig.getAggressiveCacheAge()) .append(";").append(NL_LVL_0); } if (_widgetConfig.getMaxCacheSize() != null) { buffer.append("_maxCacheSize = ").append(_widgetConfig.getMaxCacheSize()) .append(";").append(NL_LVL_0); } if (_widgetConfig.getMaxCacheItemSize() != null) { buffer.append("_maxCacheable = ").append(_widgetConfig.getMaxCacheItemSize()) .append(";").append(NL_LVL_0); } // Debug issue fix ? if(_widgetConfig.isDebugEnabled()) { buffer.append("_debugEnabled = true;").append(NL_LVL_0); } // Auto-Startup options if(_widgetConfig.allowInvokeParams()) { buffer.append("_allowInvokeParams = ").append(_widgetConfig.allowInvokeParams()) .append(";").append(NL_LVL_0); } if(_widgetConfig.isStartupEnabled()) { buffer.append("_runOnStartup = ").append(_widgetConfig.isStartupEnabled()) .append(";").append(NL_LVL_0); } // Add 3rd party extensions for (int j = 0; j < _widgetConfig.getExtensionClasses().size(); j++) { String extensionClass = _widgetConfig.getExtensionClasses().elementAt(j); buffer.append("_widgetExtensions.addElement(new ") .append(extensionClass).append("());").append(NL_LVL_0); } // Add extension JS files for (int j = 0; j < _widgetConfig.getExtensionJSFiles().size(); j++) { String extensionJSFile = _widgetConfig.getExtensionJSFiles().elementAt(j); buffer.append("_jsInjectionPaths.addElement(\"").append(extensionJSFile).append("\");").append(NL_LVL_0); } // Add shared global JS files for (int j = 0; j < _widgetConfig.getSharedGlobalJSFiles().size(); j++) { String sharedGlobalJSFile = _widgetConfig.getSharedGlobalJSFiles().elementAt(j); buffer.append("_sharedGlobalJSInjectionPaths.addElement(\"").append(sharedGlobalJSFile).append("\");").append(NL_LVL_0); } // Add transport if (_widgetConfig.getTransportTimeout() >= 0) { buffer.append("_transportTimeout = new Integer(") .append(_widgetConfig.getTransportTimeout()).append(");").append(NL_LVL_0); } if (_widgetConfig.getTransportOrder() != null) { buffer.append("_preferredTransports = new int[]{").append(NL_LVL_0); for(int i=0; i<_widgetConfig.getTransportOrder().length; i++) { String transport = _widgetConfig.getTransportOrder()[i]; if (i+1 != _widgetConfig.getTransportOrder().length) { transport += ","; } buffer.append(transport).append(NL_LVL_1); } buffer.append("};").append(NL_LVL_0); } // Add access/features if (_widgetConfig.getAccessTable().size() > 0) { String line; buffer.append("try {").append(NL_LVL_0); for (WidgetAccess key : _widgetConfig.getAccessTable().keySet()) { line = "_accessList.put("; buffer.append(line).append(NL_LVL_1); String uri = key.getURI().toString(); if (uri.equals("WidgetConfig.WIDGET_LOCAL_DOMAIN")) { line = uri + ","; } else { line = "\"" + uri + "\"" + ","; } buffer.append(line).append(NL_LVL_2); buffer.append("new WidgetAccess(").append(NL_LVL_2); buffer.append(line).append(NL_LVL_3); line = (Boolean.valueOf(key.allowSubDomain())).toString() + ","; buffer.append(line).append(NL_LVL_3); buffer.append("new WidgetFeature[] {").append(NL_LVL_3); Vector<?> wfList = (Vector<?>)_widgetConfig.getAccessTable().get(key); for (int j = 0; j < wfList.size(); j++) { WidgetFeature wf = (WidgetFeature) wfList.get(j); buffer.append("new WidgetFeature(").append(NL_LVL_4); line = "\"" + wf.getID() + "\"" + ","; buffer.append(line).append(NL_LVL_5); line = (Boolean.valueOf(wf.isRequired())).toString() + ","; buffer.append(line).append(NL_LVL_5); line = "\"" + wf.getVersion() + "\"" + ","; buffer.append(line).append(NL_LVL_5); line = "null)"; if (j+1 != wfList.size()) { line += ","; } buffer.append(line).append(NL_LVL_5); } buffer.append("}").append(NL_LVL_3); buffer.append(")").append(NL_LVL_2); buffer.append(");").append(NL_LVL_1); } buffer.append("} catch (Exception e) {").append(NL_LVL_0); buffer.append("// ignore this element - invalid URI").append(NL_LVL_1); buffer.append("}").append(NL_LVL_0); } buffer.append(NL).append(TAB).append("}").append(NL).append("}"); return buffer.toString().getBytes(); } private String escapeSpecialCharacterForJavaSource(String s) { // process escaped characters // " -> \\\\\" // ' -> \\\\\' // \ -> \\\\\\\\ // NOTE: \\\\ (4 SLASHES) stand for 1 \ (SLASH) if (s == null) return null; String ret = s.replaceAll(Pattern.quote("\\"), "\\\\\\\\") .replaceAll(Pattern.quote("\""), "\\\\\"") .replaceAll(Pattern.quote("\'"), "\\\\\'"); return ret; } }