javaextensions/midppush/javasrc/com/nokia/mj/impl/push/PushRegistratorImpl.java
branchRCL_3
changeset 19 04becd199f91
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javaextensions/midppush/javasrc/com/nokia/mj/impl/push/PushRegistratorImpl.java	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,289 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+package com.nokia.mj.impl.push;
+
+import com.nokia.mj.impl.gcf.PushSecurityUtils;
+import com.nokia.mj.impl.installer.pushregistrator.PushRegistrator;
+import com.nokia.mj.impl.installer.pushregistrator.PushInfo;
+import com.nokia.mj.impl.installer.pushregistrator.PushRegistrationException;
+import com.nokia.mj.impl.utils.InstallerErrorMessage;
+import com.nokia.mj.impl.utils.InstallerDetailedErrorMessage;
+import com.nokia.mj.impl.utils.OtaStatusCode;
+import com.nokia.mj.impl.installer.pushregistrator.PushApplicationInfo;
+import com.nokia.mj.impl.storage.StorageSession;
+import com.nokia.mj.impl.storage.StorageFactory;
+import com.nokia.mj.impl.storage.StorageNames;
+import com.nokia.mj.impl.storage.StorageException;
+import com.nokia.mj.impl.utils.Uid;
+import javax.microedition.io.ConnectionNotFoundException;
+import java.security.AccessControlException;
+import java.lang.IllegalArgumentException;
+import java.util.Vector;
+import java.util.Enumeration;
+import java.util.Hashtable;
+
+import com.nokia.mj.impl.utils.Logger;
+
+public final class PushRegistratorImpl implements PushRegistrator
+{
+
+    private static final int DYN_PUSH_REG     = 0;
+    private static final int STATIC_PUSH_REG  = 1;
+
+    public PushRegistratorImpl()
+    {
+    }
+
+    /**
+     *
+     */
+    private boolean isUniqueConstraintErr(String aErrTxt)
+    {
+        if (-1 != aErrTxt.indexOf("-329"))
+            return true;
+        if (-1 != aErrTxt.indexOf("-95"))
+            return true;
+        return false;
+    }
+
+    /**
+     *
+     */
+    public void registerPush(StorageSession aSession, Uid aSuiteUid, PushInfo[] aPushInfos)
+    {
+        Logger.ILOG(Logger.EJavaInstaller, "PushRegistratorImpl.registerPush() #1");
+
+        if ((null == aSession) || (null == aSuiteUid))
+        {
+            throw new PushRegistrationException(InstallerErrorMessage.INST_UNEXPECTED_ERR,null,
+                                                InstallerDetailedErrorMessage.INTERNAL_ERROR,
+                                                new String[] { "null passed as argument to registerPush()" },
+                                                OtaStatusCode.INTERNAL_ERROR,null);
+        }
+
+        if (null == aPushInfos)
+            return;
+        if (0 == aPushInfos.length)
+            return;
+
+        int i = 0;
+        try
+        {
+            for (; i < aPushInfos.length; i++)
+            {
+                PushSecurityUtils.ensurePermission(aPushInfos[i].getUid(),"staticregistration");
+            }//end for
+
+            //Validating push arguments. Note: Installer has already validated
+            //class name of the application.
+            for (i = 0; i < aPushInfos.length; ++i)
+            {
+                //Dynamic push regs are not needed to validate because those has been
+                //already validated.
+                Logger.LOG(Logger.EJavaInstaller, Logger.EInfo,
+                           "Calling PushValidatorLoader.validatePushArguments() operation");
+                PushValidatorLoader.getInstance().validatePushArguments
+                (aPushInfos[i].getConnectionUrl(),aPushInfos[i].getFilter(),aSuiteUid,
+                 aPushInfos[i].getName(),true);
+            }//end for
+
+            //Next push registrations are stored into the db.
+            PushDbHandler.storePushRegs(aSession,aPushInfos);
+        }
+        catch (ConnectionNotFoundException ex)
+        {
+            Logger.ELOG(Logger.EJavaInstaller,"registerPush(): Orig. exception: " + ex);
+            throw new PushRegistrationException(InstallerErrorMessage.INST_PUSH_REG_ERR,null,
+                                                InstallerDetailedErrorMessage.ATTR_UNSUPPORTED,
+                                                new String[] {aPushInfos[i].getConnectionUrl()},
+                                                OtaStatusCode.PUSH_REGISTRATION_FAILURE);
+        }
+        catch (IllegalArgumentException ex)
+        {
+            Logger.ELOG(Logger.EJavaInstaller,"registerPush(): Orig. exception: " + ex);
+            throw new PushRegistrationException(InstallerErrorMessage.INST_PUSH_REG_ERR,null,
+                                                InstallerDetailedErrorMessage.ATTR_HANDLING_FAILED,
+                                                new String[] {aPushInfos[i].getPushAttribute()},
+                                                OtaStatusCode.PUSH_REGISTRATION_FAILURE);
+        }
+        catch (StorageException ex)
+        {
+            Logger.ELOG(Logger.EJavaInstaller,
+                        "registerPush(): Orig. exception: " + ex.toString());
+            int errCode = InstallerErrorMessage.INST_UNEXPECTED_ERR;
+            String[] errTxt = new String[] {"Storing push registrations failed to the db error"};
+            if (true == isUniqueConstraintErr(ex.toString()))
+            {
+                errCode = InstallerErrorMessage.INST_PUSH_REG_ERR;
+                errTxt = new String[] {"Storing push registrations failed to unique constraint error"};
+            }
+            throw new PushRegistrationException(errCode,null,
+                                                InstallerDetailedErrorMessage.INTERNAL_ERROR,
+                                                errTxt,OtaStatusCode.PUSH_REGISTRATION_FAILURE);
+        }
+        catch (PushRegistrationException ex)
+        {
+            throw ex;
+        }
+        catch (AccessControlException ex)
+        {
+            Logger.ELOG(Logger.EJavaInstaller,"registerPush(): Orig. exception: " + ex);
+            throw new PushRegistrationException(InstallerErrorMessage.INST_PUSH_REG_ERR,null,
+                                                InstallerDetailedErrorMessage.ATTR_HANDLING_FAILED,
+                                                new String[] {aPushInfos[i].getPushAttribute()},
+                                                OtaStatusCode.APPLICATION_AUTHORIZATION_FAILURE,null);
+        }
+        catch (Throwable ex)
+        {
+            Logger.ELOG(Logger.EJavaInstaller,"registerPush(): Orig. exception: " + ex);
+            throw new PushRegistrationException(InstallerErrorMessage.INST_UNEXPECTED_ERR,null,
+                                                InstallerDetailedErrorMessage.INTERNAL_ERROR,
+                                                new String[] { "Registering push attributes failed to unexpected exception" },
+                                                OtaStatusCode.INTERNAL_ERROR,ex);
+        }
+    }//end registerPush
+
+    /**
+     *
+     */
+    public void unregisterPush(StorageSession aSession, Uid aSuiteUid, Uid[] aUids)
+    {
+        Logger.LOG(Logger.EJavaInstaller, Logger.EInfo, "PushRegistratorImpl.unregisterPush()");
+
+        if (null == aSession)
+        {
+            throw new PushRegistrationException(InstallerErrorMessage.UNINST_UNEXPECTED_ERR,null,
+                                                InstallerDetailedErrorMessage.INTERNAL_ERROR,
+                                                new String[] { "unregisterPush() 'aSession' argument is null" },
+                                                OtaStatusCode.INTERNAL_ERROR,null);
+        }
+        if (aUids == null)
+            return;
+
+        try
+        {
+            for (int i = 0; i < aUids.length; i++)
+            {
+                PushDbHandler.deletePushRegs(aSession,aUids[i]);
+                PushDbHandler.deleteAlarm(aSession,aUids[i]);
+            }//end for
+        }
+        catch (StorageException ex)
+        {
+            Logger.ELOG(Logger.EJavaInstaller,"unregisterPush(): Orig. exception: " + ex);
+            throw new PushRegistrationException(InstallerErrorMessage.UNINST_UNEXPECTED_ERR,null,
+                                                InstallerDetailedErrorMessage.INTERNAL_ERROR,
+                                                new String[] { "Deleting push registrations failed to the db error" },
+                                                OtaStatusCode.INTERNAL_ERROR,ex);
+        }
+        catch (Throwable ex)
+        {
+            Logger.ELOG(Logger.EJavaInstaller,"unregisterPush(): Orig. exception: " + ex);
+            throw new PushRegistrationException(InstallerErrorMessage.UNINST_UNEXPECTED_ERR,null,
+                                                InstallerDetailedErrorMessage.INTERNAL_ERROR,
+                                                new String[] { "Unregistering push attributes failed to unexpected exception" },
+                                                OtaStatusCode.INTERNAL_ERROR,ex);
+        }
+    }
+
+    /**
+     *
+     */
+    public void upgradePush(StorageSession aSession,
+                            Uid aSuiteUid,
+                            PushApplicationInfo[] aOldPushAppInfos,
+                            PushApplicationInfo[] aNewPushApplicationInfos,
+                            PushInfo[] aNewPushInfos)
+    {
+        Logger.LOG(Logger.EJavaInstaller, Logger.EInfo, "PushRegistratorImpl.upgradePush()");
+
+        //This should never happen.
+        if ((null == aOldPushAppInfos) || (null == aNewPushApplicationInfos) || (null == aSession))
+        {
+            throw new PushRegistrationException(InstallerErrorMessage.INST_UNEXPECTED_ERR,null,
+                                                InstallerDetailedErrorMessage.INTERNAL_ERROR,
+                                                new String[] { "upgradePush() One of the mandatory argument is null" },
+                                                OtaStatusCode.INTERNAL_ERROR,null);
+        }
+
+        try
+        {
+            //First is deleted all push regs and alarms.
+            for (int i = 0; i < aOldPushAppInfos.length; i++)
+            {
+                PushDbHandler.deletePushRegs(aSession,aOldPushAppInfos[i].getUid());
+                PushDbHandler.deleteAlarm(aSession,aOldPushAppInfos[i].getUid());
+            }
+        }
+        catch (StorageException ex)
+        {
+            Logger.ELOG(Logger.EJavaInstaller,"upgradePush(): Orig. exception: " + ex);
+            throw new PushRegistrationException(InstallerErrorMessage.INST_UNEXPECTED_ERR,null,
+                                                InstallerDetailedErrorMessage.INTERNAL_ERROR,
+                                                new String[] { "Upgrading push registrations failed to the db error" },
+                                                OtaStatusCode.INTERNAL_ERROR,ex);
+        }
+
+        registerPush(aSession,aSuiteUid,aNewPushInfos);
+    }
+
+    /**
+     *
+     */
+    public PushInfo[] getPushInfos(Uid aUid)
+    {
+        Logger.LOG(Logger.EJavaInstaller, Logger.EInfo, "PushRegistratorImpl.getPushInfos()");
+
+        StorageSession sessionObj = null;
+        try
+        {
+            sessionObj = StorageFactory.createSession();
+            sessionObj.open();
+
+            PushInfo[] retTable = PushDbHandler.getPushRegs(sessionObj,aUid);
+            return retTable;
+        }
+        catch (StorageException ex)
+        {
+            Logger.ELOG(Logger.EJavaInstaller,"upgradePush(): Orig. exception: " + ex);
+            throw new PushRegistrationException(InstallerErrorMessage.INST_UNEXPECTED_ERR,null,
+                                                InstallerDetailedErrorMessage.INTERNAL_ERROR,
+                                                new String[] { "Getting push registrations failed to the db error" },
+                                                OtaStatusCode.INTERNAL_ERROR,ex);
+        }
+        catch (Throwable ex)
+        {
+            Logger.ELOG(Logger.EJavaInstaller,"upgradePush(): Orig. exception: " + ex);
+            throw new PushRegistrationException(InstallerErrorMessage.INST_UNEXPECTED_ERR,null,
+                                                InstallerDetailedErrorMessage.INTERNAL_ERROR,
+                                                new String[] { "Getting push attributes failed to unexpected exception" },
+                                                OtaStatusCode.INTERNAL_ERROR,ex);
+        }
+        finally
+        {
+            if (null != sessionObj)
+            {
+                sessionObj.close();
+                sessionObj.destroySession();
+            }
+        }
+    }//end getPushInfos
+
+}//end PushRegistratorImpl
+