/* * 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. */ /** * @author Boris V. Kuznetsov * @version $Revision$ */ package org.apache.harmony.security.fortress; import java.security.NoSuchAlgorithmException; import java.security.Provider; import org.apache.harmony.security.internal.nls.Messages; /** * * This class implements common functionality for all engine classes * */ public class Engine { // Service name private String serviceName; // for getInstance(String algorithm, Object param) optimization: // previous result private Provider.Service returnedService; // previous parameter private String lastAlgorithm; private int refreshNumber; /** * Provider */ public Provider provider; /** * SPI instance */ public Object spi; /** * Access to package visible api in java.security */ public static SecurityAccess door; /** * Creates a Engine object * * @param service */ public Engine(String service) { this.serviceName = service; } /** * * Finds the appropriate service implementation and creates instance of the * class that implements corresponding Service Provider Interface. * * @param algorithm * @param service * @throws NoSuchAlgorithmException */ public synchronized void getInstance(String algorithm, Object param) throws NoSuchAlgorithmException { Provider.Service serv; if (algorithm == null) { throw new NoSuchAlgorithmException(Messages.getString("security.149")); //$NON-NLS-1$ } Services.refresh(); if (returnedService != null && algorithm.equalsIgnoreCase(lastAlgorithm) && refreshNumber == Services.refreshNumber) { serv = returnedService; } else { if (Services.isEmpty()) { throw new NoSuchAlgorithmException(Messages.getString("security.14A", //$NON-NLS-1$ serviceName, algorithm)); } serv = Services.getService(new StringBuffer(128) .append(serviceName).append(".").append( //$NON-NLS-1$ algorithm.toUpperCase()).toString()); if (serv == null) { throw new NoSuchAlgorithmException(Messages.getString("security.14A", //$NON-NLS-1$ serviceName, algorithm)); } returnedService = serv; lastAlgorithm = algorithm; refreshNumber = Services.refreshNumber; } spi = serv.newInstance(param); this.provider = serv.getProvider(); } /** * * Finds the appropriate service implementation and creates instance of the * class that implements corresponding Service Provider Interface. * * @param algorithm * @param service * @param provider * @throws NoSuchAlgorithmException */ public synchronized void getInstance(String algorithm, Provider provider, Object param) throws NoSuchAlgorithmException { Provider.Service serv = null; if (algorithm == null) { throw new NoSuchAlgorithmException( Messages.getString("security.14B", serviceName)); //$NON-NLS-1$ } serv = provider.getService(serviceName, algorithm); if (serv == null) { throw new NoSuchAlgorithmException(Messages.getString("security.14A", //$NON-NLS-1$ serviceName, algorithm)); } spi = serv.newInstance(param); this.provider = provider; } }