/* Copyright (C) 2009 Mobile Sorcery AB This program is free software; you can redistribute it and/or modify it under the terms of the Eclipse Public License v1.0. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Eclipse Public License v1.0 for more details. You should have received a copy of the Eclipse Public License v1.0 along with this program. It is also available at http://www.eclipse.org/legal/epl-v10.html */ package com.mobilesorcery.sdk.builder.iphoneos; import java.text.MessageFormat; import org.eclipse.jface.dialogs.IMessageProvider; import org.eclipse.ui.plugin.AbstractUIPlugin; import org.osgi.framework.BundleContext; import com.mobilesorcery.sdk.core.MoSyncProject; import com.mobilesorcery.sdk.core.PropertyUtil; import com.mobilesorcery.sdk.core.Util; import com.mobilesorcery.sdk.ui.DefaultMessageProvider; /** * The activator class controls the plug-in life cycle */ public class Activator extends AbstractUIPlugin { // The plug-in ID public static final String PLUGIN_ID = "com.mobilesorcery.sdk.builder.iphoneose"; //$NON-NLS-1$ public final static String IOS_SIMULATOR_SPECIFIER = "simulator"; public final static String ONLY_GENERATE_XCODE_PROJECT = PLUGIN_ID + ".build.xcode"; public final static String IPHONE_DEV_CERT = "iPhone Developer"; public final static String IPHONE_DIST_CERT = "iPhone Distribution"; // The shared instance private static Activator plugin; /** * The constructor */ public Activator() { } /* * (non-Javadoc) * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext) */ @Override public void start(BundleContext context) throws Exception { super.start(context); plugin = this; } /* * (non-Javadoc) * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext) */ @Override public void stop(BundleContext context) throws Exception { plugin = null; super.stop(context); } /** * Returns the shared instance * * @return the shared instance */ public static Activator getDefault() { return plugin; } /** * Returns the current SDKs for a project * @param project * @param sdkType * @return */ public SDK getSDK(MoSyncProject project, int sdkType) { boolean useDefault = PropertyUtil.getBoolean(project, sdkType == XCodeBuild.IOS_SDKS ? PropertyInitializer.IOS_SDK_AUTO : PropertyInitializer.IOS_SIM_SDK_AUTO); String sdkId = project.getProperty(sdkType == XCodeBuild.IOS_SDKS ? PropertyInitializer.IOS_SDK : PropertyInitializer.IOS_SIM_SDK); SDK sdk = useDefault ? XCodeBuild.getDefault().getDefaultSDK(sdkType) : XCodeBuild.getDefault().getSDK(sdkId); return sdk; } /** * Set the SDK to use for a project * @param project * @param sdkType * @param sdk * @param useDefault */ public void setSDK(MoSyncProject project, int sdkType, SDK sdk, boolean useDefault) { String sdkId = useDefault || sdk == null ? null : sdk.getId(); PropertyUtil.setBoolean(project, sdkType == XCodeBuild.IOS_SDKS ? PropertyInitializer.IOS_SDK_AUTO : PropertyInitializer.IOS_SIM_SDK_AUTO, useDefault); project.setProperty(sdkType == XCodeBuild.IOS_SDKS ? PropertyInitializer.IOS_SDK : PropertyInitializer.IOS_SIM_SDK, sdkId); } /** * Validates a UTI, which is used for bundler identifiers etc. * @param ignoreParameters * @param uti * @return */ public IMessageProvider validateBundleIdentifier(String bundleId, boolean ignoreParameters) { String message = null; int messageType = IMessageProvider.ERROR; if (Util.isEmpty(bundleId)) { message = "Bundle identifier cannot be empty"; } else if (bundleId.contains("..")) { message = MessageFormat.format("Bundle identifier cannot have empty segment ({0})", bundleId); } else if (bundleId.endsWith(".") || bundleId.startsWith(".")) { message = MessageFormat.format("Bundle identifier cannot start or end with '.' ({0})", bundleId); } else if (containsInvalidChars(bundleId, ignoreParameters)) { message = MessageFormat.format("Bundle identifier segments can only contain letters, digits and '-'. ({0})", bundleId); } else if (!bundleId.startsWith("com.")) { message = "Bundle identifier should start with 'com.'"; messageType = IMessageProvider.WARNING; } else if (bundleId.split("\\.").length != 3) { message = "Recommended bundle identifier format: com.YOURCOMPANY.YOURAPP"; messageType = IMessageProvider.WARNING; } return Util.isEmpty(message) ? DefaultMessageProvider.EMPTY : new DefaultMessageProvider(message, messageType); } private boolean containsInvalidChars(String bundleId, boolean ignoreParameters) { for (int i = 0; i < bundleId.length(); i++) { char ch = bundleId.charAt(i); boolean valid = ch > 32 && ch < 128 && (Character.isLetter(ch) || Character.isDigit(ch) || ch == '-' || ch == '.'); valid |= (ignoreParameters && ch == '%'); if (!valid) { return true; } } return false; } }