Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Licensed to the Apache Software Foundation (ASF) under one
   * or more contributor license agreements.  See the NOTICE file
   * distributed with this work for additional information
   * regarding copyright ownership.  The ASF licenses this file
   * to you 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.apache.felix.webconsole.internal.core;
 
 
 import java.io.File;
 
 import  org.osgi.service.obr.RepositoryAdmin;
 import  org.osgi.service.obr.Requirement;
 import  org.osgi.service.obr.Resolver;
 import  org.osgi.service.obr.Resource;
 
 
 {
 
     private final Bundle bundle;
 
 
     UpdateHelperfinal SimpleWebConsolePlugin pluginfinal Bundle bundleboolean refreshPackages )
     {
         thispluginbundlenullrefreshPackages );
     }
 
 
     UpdateHelperfinal SimpleWebConsolePlugin pluginfinal Bundle bundlefinal File bundleFile,
         boolean refreshPackages )
     {
         superplugin"Background Update " + bundle.getSymbolicName() + " (" + bundle.getBundleId() + ")",
             bundleFilerefreshPackages );
         this. = bundle;
     }
 
 
     protected Bundle doRunfinal InputStream bundleStream ) throws BundleException
     {
         .updatebundleStream );
         return ;
     }
 
 
     protected Bundle doRun() throws Exception
     {
         // update the bundle from the file if defined
         if ( getBundleFile() != null )
         {
             return super.doRun();
         }
 
         // try updating from the bundle location
         if ( updateFromBundleLocation() )
         {
             return ;
         }
 
         // ensure we have a symbolic name for the OBR update to follow
         if ( .getSymbolicName() == null )
         {
             throw new BundleException"Cannot update bundle: Symbolic Name is required for OBR update" );
         }
 
         // try updating from Apache Felix OBR
         if ( updateFromFelixOBR() )
         {
             return ;
         }
 
         // try updating from OSGi OBR
         if ( updateFromOsgiOBR() )
         {
             return ;
         }
 
         // bundle was not updated, return nothing
         return null;
     }
    private boolean updateFromBundleLocation()
    {
        getLog().log."Trying to update with Bundle.update()" );
        try
        {
            .update();
            getLog().log."Bundle updated from bundle provided (update) location" );
            return true;
        }
        catch ( Throwable ioe )
        {
            // BundleException, IllegalStateException or SecurityException? lets use OBR then
            getLog().log."Update failure using Bundle.update()"ioe );
        }
        // not installed from the bundle location
        return false;
    }
    private boolean updateFromFelixOBR()
    {
        org.apache.felix.bundlerepository.RepositoryAdmin ra = ( org.apache.felix.bundlerepository.RepositoryAdmin ) getService"org.apache.felix.bundlerepository.RepositoryAdmin" );
        if ( ra != null )
        {
            getLog().log."Trying to update from OSGi Bundle Repository (Apache Felix API)" );
            final org.apache.felix.bundlerepository.Resolver resolver = ra.resolver();
            String version = ( String ) .getHeaders().get. );
            if ( version == null )
            {
                version = "0.0.0";
            }
            final String filter = "(&(symbolicname=" + .getSymbolicName() + ")(!(version=" + version
                + "))(version>=" + version + "))";
            final org.apache.felix.bundlerepository.Requirement req = ra.getHelper().requirement(
                .getSymbolicName(), filter );
            final org.apache.felix.bundlerepository.Resource[] resources = ra
                .discoverResourcesnew org.apache.felix.bundlerepository.Requirement[]
                    { req } );
            final org.apache.felix.bundlerepository.Resource resource = selectHighestVersionresources );
            if ( resource != null )
            {
                resolver.addresource );
                if ( !resolver.resolve() )
                {
                    logRequirements"Cannot updated bundle from OBR due to unsatisfied requirements"resolver
                        .getUnsatisfiedRequirements() );
                }
                else
                {
                    logResource"Installing Requested Resources"resolver.getAddedResources() );
                    logResource"Installing Required Resources"resolver.getRequiredResources() );
                    logResource"Installing Optional Resources"resolver.getOptionalResources() );
                    // deploy the resolved bundles and ensure they are started
                    resolver.deploy..... );
                    getLog().log."Bundle updated from OSGi Bundle Repository" );
                    return true;
                }
            }
            else
            {
                getLog().log.,
                "Nothing to update, OSGi Bundle Repository does not provide more recent version" );
            }
        }
        else
        {
            getLog().log."Cannot updated from OSGi Bundle Repository: Service not available" );
        }
        // fallback to false, nothing done
        return false;
    }
    private boolean updateFromOsgiOBR()
    {
        RepositoryAdmin ra = ( RepositoryAdmin ) getService"org.osgi.service.obr.RepositoryAdmin" );
        if ( ra != null )
        {
            getLog().log."Trying to update from OSGi Bundle Repository (OSGi API)" );
            final Resolver resolver = ra.resolver();
            String version = ( String ) .getHeaders().get. );
            if ( version == null )
            {
                version = "0.0.0";
            }
            final String filter = "(&(symbolicname=" + .getSymbolicName() + ")(!(version=" + version
                + "))(version>=" + version + "))";
            final Resource[] resources = ra.discoverResources( filter );
            final Resource resource = selectHighestVersionresources );
            if ( resource != null )
            {
                resolver.add( resource );
                if ( !resolver.resolve() )
                {
                    logRequirements"Cannot updated bundle from OBR due to unsatisfied requirements"resolver
                        .getUnsatisfiedRequirements() );
                }
                else
                {
                    logResource"Installing Requested Resources"resolver.getAddedResources() );
                    logResource"Installing Required Resources"resolver.getRequiredResources() );
                    logResource"Installing Optional Resources"resolver.getOptionalResources() );
                    // deploy the resolved bundles and ensure they are started
                    resolver.deploy( true );
                    getLog().log."Bundle updated from OSGi Bundle Repository" );
                    return true;
                }
            }
            else
            {
                getLog().log.,
                    "Nothing to update, OSGi Bundle Repository does not provide more recent version" );
            }
        }
        else
        {
            getLog().log."Cannot updated from OSGi Bundle Repository: Service not available" );
        }
        // fallback to false, nothing done
        return false;
    }
    //---------- Apache Felix OBR API helper
        final org.apache.felix.bundlerepository.Resource[] candidates )
    {
        if ( candidates == null || candidates.length == 0 )
        {
            // nothing to do if there are none
            return null;
        }
        else if ( candidates.length == 1 )
        {
            // simple choice if there is a single one
            return candidates[0];
        }
        // now go on looking for the highest version
        org.apache.felix.bundlerepository.Resource best = candidates[0];
        for ( int i = 1; i < candidates.lengthi++ )
        {
            if ( best.getVersion().compareTocandidates[i].getVersion() ) < 0 )
            {
                best = candidates[i];
            }
        }
        return best;
    }
    private void logResourceString messageorg.apache.felix.bundlerepository.Resource[] res )
    {
        if ( res != null && res.length > 0 )
        {
            getLog().log.message );
            for ( int i = 0; i < res.lengthi++ )
            {
                getLog().log.,
                    "  " + i + ": " + res[i].getSymbolicName() + ", " + res[i].getVersion() );
            }
        }
    }
    private void logRequirementsString messageReason[] reasons )
    {
        getLog().log.message );
        for ( int i = 0; reasons != null && i < reasons.lengthi++ )
        {
            String moreInfo = reasons[i].getRequirement().getComment();
            if ( moreInfo == null )
            {
                moreInfo = reasons[i].getRequirement().getFilter().toString();
            }
            getLog().log.,
                "  " + i + ": " + reasons[i].getRequirement().getName() + " (" + moreInfo + ")" );
        }
    }
    //---------- OSGi OBR API helper
    private Resource selectHighestVersionfinal Resource[] candidates )
    {
        if ( candidates == null || candidates.length == 0 )
        {
            // nothing to do if there are none
            return null;
        }
        else if ( candidates.length == 1 )
        {
            // simple choice if there is a single one
            return candidates[0];
        }
        // now go on looking for the highest version
        Resource best = candidates[0];
        for ( int i = 1; i < candidates.length; i++ )
        {
            if ( best.getVersion().compareTo( candidates[i].getVersion() ) < 0)
            {
                best = candidates[i];
            }
        }
        return best;
    }
    private void logResourceString message, Resource[] res )
    {
        if ( res != null && res.length > 0 )
        {
            getLog().log.message );
            for ( int i = 0; i < res.length; i++ )
            {
                getLog().log.,
                    "  " + i + ": " + res[i].getSymbolicName() + ", " + res[i].getVersion() );
            }
        }
    }
    private void logRequirementsString message, Requirement[] reasons )
    {
        getLog().log.message );
        for ( int i = 0; reasons != null && i < reasons.length; i++ )
        {
            String moreInfo = reasons[i].getComment();
            if ( moreInfo == null )
            {
                moreInfo = reasons[i].getFilter().toString();
            }
            getLog().log."  " + i + ": " + reasons[i].getName() + " (" + moreInfo + ")" );
        }
    }
New to GrepCode? Check out our FAQ X