
org.testifyproject.glassfish.hk2.utilities.AliasDescriptor Maven / Gradle / Ivy
/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright (c) 2012 Oracle and/or its affiliates. All rights reserved.
*
* The contents of this file are subject to the terms of either the GNU
* General Public License Version 2 only ("GPL") or the Common Development
* and Distribution License("CDDL") (collectively, the "License"). You
* may not use this file except in org.testifyproject.testifyprojectpliance with the License. You can
* obtain a copy of the License at
* https://glassfish.org.testifyproject.testifyprojectv.java.net/public/CDDL+GPL_1_1.html
* or packager/legal/LICENSE.txt. See the License for the specific
* language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each
* file and include the License file at packager/legal/LICENSE.txt.
*
* GPL Classpath Exception:
* Oracle org.testifyproject.testifyprojectsignates this particular file as subject to the "Classpath"
* exception as provided by Oracle in the GPL Version 2 section of the License
* file that accompanied this code.
*
* Modifications:
* If applicable, add the following below the License Header, with the fields
* enclosed by brackets [] replaced by your own identifying information:
* "Portions Copyright [year] [name of copyright owner]"
*
* Contributor(s):
* If you wish your version of this file to be governed by only the CDDL or
* only the GPL Version 2, indicate your org.testifyproject.testifyprojectcision by adding "[Contributor]
* elects to include this software in this distribution under the [CDDL or GPL
* Version 2] license." If you don't indicate a single choice of license, a
* recipient has the option to distribute your version of this file under
* either the CDDL, the GPL Version 2 or to extend the choice of license to
* its licensees as provided above. However, if you add GPL Version 2 code
* and therefore, elected the GPL Version 2 license, then the option applies
* only if the new code is made subject to such option by the copyright
* holder.
*/
package org.testifyproject.glassfish.hk2.utilities;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.inject.Named;
import org.testifyproject.glassfish.hk2.api.ActiveDescriptor;
import org.testifyproject.glassfish.hk2.api.HK2Loader;
import org.testifyproject.glassfish.hk2.api.Injectee;
import org.testifyproject.glassfish.hk2.api.ServiceHandle;
import org.testifyproject.glassfish.hk2.api.ServiceLocator;
/**
* An active org.testifyproject.testifyprojectscriptor class that serves as an alias for another org.testifyproject.testifyprojectscriptor.
* This alias can have only one contract that may or may not also be
* advertised by the host org.testifyproject.testifyprojectscriptor. An AliasDescriptor
* can have a different name from the host org.testifyproject.testifyprojectscriptor as well
*
* @author tbeerbower
* @param The cache type
*/
public class AliasDescriptor extends AbstractActiveDescriptor {
/**
* This will be put in all Alias org.testifyproject.testifyprojectscriptors. The value
* will be ALIAS_FREE_DESCRIPTOR if the org.testifyproject.testifyprojectscritpor being
* aliased does not have a locator and service id. If
* the org.testifyproject.testifyprojectscriptor being aliased does have a locator and
* service id the value will be .
*/
public final static String ALIAS_METADATA_MARKER = "__AliasOf";
/**
* This is the value the metadata field ALIAS_METADATA_MARKER will
* take if the org.testifyproject.testifyprojectscriptor being aliased does not have a locator id
* or a service id
*/
public final static String ALIAS_FREE_DESCRIPTOR = "FreeDescriptor";
/**
* For serialization
*/
private static final long serialVersionUID = 2609895430798803508L;
/**
* The service locator.
*/
private ServiceLocator locator;
/**
* The org.testifyproject.testifyprojectscriptor that this org.testifyproject.testifyprojectscriptor will alias.
*/
private ActiveDescriptor org.testifyproject.testifyprojectscriptor;
/**
* The contract type of this org.testifyproject.testifyprojectscriptor.
*/
private String contract;
/**
* The set of annotations for this org.testifyproject.testifyprojectscriptor.
*/
private Set qualifiers;
/**
* The set of qualifier names for this org.testifyproject.testifyprojectscriptor.
*/
private Set qualifierNames;
/**
* Indicates whether or not this org.testifyproject.testifyprojectscriptor has been initialized.
*/
private boolean initialized = false;
// ----- Constants ------------------------------------------------------
/**
* Empty set of contracts used to construct this org.testifyproject.testifyprojectscriptor.
*/
private static final Set EMPTY_CONTRACT_SET = new HashSet();
/**
* Empty set of annotations used to construct this org.testifyproject.testifyprojectscriptor.
*/
private static final Set EMPTY_ANNOTATION_SET = new HashSet();
// ----- Constructors ---------------------------------------------------
/**
* For serialization
*/
public AliasDescriptor() {
super();
}
/**
* Construct an AliasDescriptor.
*
* @param locator the service locator
* @param org.testifyproject.testifyprojectscriptor the org.testifyproject.testifyprojectscriptor to be aliased
* @param contract the contact
* @param name the name
*/
public AliasDescriptor(ServiceLocator locator,
ActiveDescriptor org.testifyproject.testifyprojectscriptor,
String contract,
String name) {
// pass in an empty contract set, an empty annotation set and a null
// scope since we are not really reified and we don't want to reify
// the given org.testifyproject.testifyprojectscriptor yet
super(EMPTY_CONTRACT_SET,
null,
name,
EMPTY_ANNOTATION_SET,
org.testifyproject.testifyprojectscriptor.getDescriptorType(),
org.testifyproject.testifyprojectscriptor.getDescriptorVisibility(),
org.testifyproject.testifyprojectscriptor.getRanking(),
org.testifyproject.testifyprojectscriptor.isProxiable(),
org.testifyproject.testifyprojectscriptor.isProxyForSameScope(),
org.testifyproject.testifyprojectscriptor.getClassAnalysisName(),
org.testifyproject.testifyprojectscriptor.getMetadata());
this.locator = locator;
this.org.testifyproject.testifyprojectscriptor = org.testifyproject.testifyprojectscriptor;
this.contract = contract;
addAdvertisedContract(contract);
super.setScope(org.testifyproject.testifyprojectscriptor.getScope());
super.addMetadata(ALIAS_METADATA_MARKER, getAliasMetadataValue(org.testifyproject.testifyprojectscriptor));
}
private static String getAliasMetadataValue(ActiveDescriptor> org.testifyproject.testifyprojectscriptor) {
Long locatorId = org.testifyproject.testifyprojectscriptor.getLocatorId();
Long serviceId = org.testifyproject.testifyprojectscriptor.getServiceId();
if (locatorId == null || serviceId == null) return ALIAS_FREE_DESCRIPTOR;
return locatorId + "." + serviceId;
}
// ----- ActiveDescriptor -----------------------------------------------
/* (non-Javadoc)
* @see org.testifyproject.glassfish.hk2.api.ActiveDescriptor#getImplementationClass()
*/
@Override
public Class> getImplementationClass() {
ensureInitialized();
return org.testifyproject.testifyprojectscriptor.getImplementationClass();
}
/* (non-Javadoc)
* @see org.testifyproject.glassfish.hk2.api.ActiveDescriptor#create(org.testifyproject.glassfish.hk2.api.ServiceHandle)
*/
@Override
public T create(ServiceHandle> root) {
ensureInitialized();
return locator.getServiceHandle(org.testifyproject.testifyprojectscriptor).getService();
}
// ----- AbstractActiveDescriptor overrides -----------------------------
/* (non-Javadoc)
* @see org.testifyproject.glassfish.hk2.api.ActiveDescriptor#isReified()
*/
@Override
public boolean isReified() {
// always return true to get past the addActiveDescriptor checks
// even though the underlying org.testifyproject.testifyprojectscriptor may not be reified yet
return true;
}
/* (non-Javadoc)
* @see org.testifyproject.glassfish.hk2.api.ActiveDescriptor#getImplementation()
*/
@Override
public String getImplementation() {
return org.testifyproject.testifyprojectscriptor.getImplementation();
}
/* (non-Javadoc)
* @see org.testifyproject.glassfish.hk2.api.ActiveDescriptor#getContractTypes()
*/
@Override
public Set getContractTypes() {
ensureInitialized();
return super.getContractTypes();
}
/* (non-Javadoc)
* @see org.testifyproject.glassfish.hk2.api.ActiveDescriptor#getScopeAnnotation()
*/
@Override
public Class extends Annotation> getScopeAnnotation() {
ensureInitialized();
return org.testifyproject.testifyprojectscriptor.getScopeAnnotation();
}
/* (non-Javadoc)
* @see org.testifyproject.glassfish.hk2.api.ActiveDescriptor#getQualifierAnnotations()
*/
@Override
public synchronized Set getQualifierAnnotations() {
ensureInitialized();
if (qualifiers == null) {
qualifiers = new HashSet(org.testifyproject.testifyprojectscriptor.getQualifierAnnotations());
if (getName() != null) {
qualifiers.add(new NamedImpl(getName()));
}
}
return qualifiers;
}
@Override
public synchronized Set getQualifiers() {
if (qualifierNames != null) return qualifierNames;
qualifierNames = new HashSet(org.testifyproject.testifyprojectscriptor.getQualifiers());
if (getName() != null) {
qualifierNames.add(Named.class.getName());
}
return qualifierNames;
}
/* (non-Javadoc)
* @see org.testifyproject.glassfish.hk2.api.ActiveDescriptor#getInjectees()
*/
@Override
public List getInjectees() {
ensureInitialized();
return org.testifyproject.testifyprojectscriptor.getInjectees();
}
/* (non-Javadoc)
* @see org.testifyproject.glassfish.hk2.api.ActiveDescriptor#dispose(java.lang.Object, org.testifyproject.glassfish.hk2.api.ServiceHandle)
*/
@Override
public void dispose(T instance) {
ensureInitialized();
org.testifyproject.testifyprojectscriptor.dispose(instance);
}
// ----- accessors ------------------------------------------------
/**
* Get the org.testifyproject.testifyprojectscriptor being aliased.
*
* @return the org.testifyproject.testifyprojectscriptor
*/
public ActiveDescriptor getDescriptor() {
return org.testifyproject.testifyprojectscriptor;
}
// ----- Utility methods ------------------------------------------------
/**
* Ensure that this org.testifyproject.testifyprojectscriptor has been initialized.
*/
@SuppressWarnings("unchecked")
private synchronized void ensureInitialized() {
if (!initialized) {
// reify the underlying org.testifyproject.testifyprojectscriptor if needed
if (!org.testifyproject.testifyprojectscriptor.isReified()) {
org.testifyproject.testifyprojectscriptor = (ActiveDescriptor) locator.reifyDescriptor(org.testifyproject.testifyprojectscriptor);
}
if (contract == null) {
initialized = true;
return;
}
HK2Loader loader = org.testifyproject.testifyprojectscriptor.getLoader();
Type contractType = null;
try {
if (loader != null) {
contractType = loader.loadClass(contract);
}
else {
Class> ic = org.testifyproject.testifyprojectscriptor.getImplementationClass();
ClassLoader cl = null;
if (ic != null) {
cl = ic.getClassLoader();
}
if (cl == null) {
cl = ClassLoader.getSystemClassLoader();
}
contractType = cl.loadClass(contract);
}
}
catch (ClassNotFoundException e) {
// do nothing
}
super.addContractType(contractType);
initialized = true;
}
}
@Override
public int hashCode() {
int retVal;
synchronized (this) {
retVal = org.testifyproject.testifyprojectscriptor.hashCode();
}
if (getName() != null) {
retVal ^= getName().hashCode();
}
if (contract != null) {
retVal ^= contract.hashCode();
}
return retVal;
}
private static boolean safeEquals(Object a, Object b) {
if (a == b) return true;
if (a == null) return false;
if (b == null) return false;
return a.equals(b);
}
@Override
public boolean equals(Object o) {
if (o == null) return false;
if (!(o instanceof AliasDescriptor)) return false;
AliasDescriptor> other = (AliasDescriptor>) o;
if (!other.org.testifyproject.testifyprojectscriptor.equals(org.testifyproject.testifyprojectscriptor)) return false;
if (!safeEquals(other.getName(), getName())) return false;
return safeEquals(other.contract, contract);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy