blob: 22965c4b427b5ac225909df260ffa419624e0b0a [file] [log] [blame]
/*
* 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.ignite.spi.deployment.uri;
import java.io.File;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.apache.ignite.internal.util.tostring.GridToStringExclude;
import org.apache.ignite.internal.util.typedef.F;
import org.apache.ignite.internal.util.typedef.P1;
import org.apache.ignite.internal.util.typedef.internal.S;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.lang.IgniteBiTuple;
import org.jetbrains.annotations.Nullable;
import static org.apache.ignite.spi.deployment.uri.GridUriDeploymentUnitDescriptor.Type.CLASS;
import static org.apache.ignite.spi.deployment.uri.GridUriDeploymentUnitDescriptor.Type.FILE;
/**
* Container for information about tasks and file where classes placed. It also contains tasks instances.
*/
class GridUriDeploymentUnitDescriptor {
/**
* Container type.
*/
@SuppressWarnings({"PackageVisibleInnerClass"}) enum Type {
/**
* Container has reference to the file with tasks.
*/
FILE,
/**
* Container keeps tasks deployed directly.
*/
CLASS
}
/**
* Container type.
*/
private final Type type;
/**
* If type is {@link Type#FILE} contains URI of {@link #file} otherwise must be null.
*/
@GridToStringExclude
private final String uri;
/**
* If type is {@link Type#FILE} contains file with tasks otherwise must be null.
*/
private final File file;
/**
* Tasks deployment timestamp.
*/
private final long tstamp;
/** */
private final ClassLoader clsLdr;
/** Set of all resources. */
private final Set<Class<?>> rsrcs = new HashSet<>();
/** Map of resources by alias. */
private final Map<String, Class<?>> rsrcsByAlias = new HashMap<>();
/**
* If type is {@link Type#FILE} and digest was computed successfully contains MD5 digest of the source file.
*/
private final String md5;
/**
* Constructs descriptor for a deployment unit.
*
* @param uri URI of the deployment unit.
* @param file File itself.
* @param tstamp Tasks deployment timestamp.
* @param clsLdr Class loader.
* @param md5 Hash of unit file of directory.
*/
GridUriDeploymentUnitDescriptor(String uri, File file, long tstamp, ClassLoader clsLdr, String md5) {
assert uri != null;
assert file != null;
assert tstamp > 0;
this.uri = uri;
this.file = file;
this.tstamp = tstamp;
this.clsLdr = clsLdr;
this.md5 = md5;
type = FILE;
}
/**
* Constructs a deployment unit descriptor based on timestamp and {@link org.apache.ignite.compute.ComputeTask}
* instances.
*
* @param tstamp Tasks deployment timestamp.
* @param clsLdr Class loader.
*/
GridUriDeploymentUnitDescriptor(long tstamp, ClassLoader clsLdr) {
assert clsLdr != null;
assert tstamp > 0;
this.tstamp = tstamp;
this.clsLdr = clsLdr;
uri = null;
file = null;
md5 = null;
type = CLASS;
}
/**
* Gets descriptor type.
*
* @return Descriptor type.
*/
public Type getType() {
return type;
}
/**
* Gets file URL.
*
* @return {@code null} if tasks were deployed directly and reference to the package file URI if tasks
* were deployed from the file.
*/
public String getUri() {
return uri;
}
/**
* Tasks' package file.
*
* @return {@code null} if tasks were deployed directly and package file if tasks were deployed from it.
*/
public File getFile() {
return file;
}
/**
* Gets tasks deployment timestamp.
*
* @return Tasks deployment timestamp.
*/
public long getTimestamp() {
return tstamp;
}
/**
* Source file MD5 digest.
*
* @return MD5 digest of the source file if it is available, otherwise {@code null}.
*/
public String getMd5() {
return md5;
}
/**
* Deployed task.
*
* @return Deployed task.
*/
public ClassLoader getClassLoader() {
return clsLdr;
}
/**
* Adds resource to this descriptor.
*
* @param cls Resource class.
*/
public void addResource(Class<?> cls) {
rsrcs.add(cls);
}
/**
* Adds resource by alias to this descriptor.
*
* @param alias Resource alias.
* @param cls Resource class.
*/
public void addResource(String alias, Class<?> cls) {
rsrcsByAlias.put(alias, cls);
rsrcs.add(cls);
}
/**
* Gets resource by alias.
*
* @param alias Resource alias.
* @return Resource class or {@code null}, if there is no resource
* for this alias.
*/
@Nullable public Class<?> getResourceByAlias(String alias) {
return rsrcsByAlias.get(alias);
}
/**
* Gets resource by alias map.
*
* @return Unmodifiable resource by alias map.
*/
public Map<String, Class<?>> getResourcesByAlias() {
return Collections.unmodifiableMap(rsrcsByAlias);
}
/**
* Gets a full resource set.
*
* @return Unmodifiable resource set.
*/
public Set<Class<?>> getResources() {
return Collections.unmodifiableSet(rsrcs);
}
/**
* Looks up for resource by name (either full class name or alias).
*
* @param rsrcName Resource name (either full class name or alias).
* @return Tuple of resource class and alias or {@code null}, if
* resource is not found. The second tuple member is
* {@code null} if the resource has no alias.
*/
@Nullable public IgniteBiTuple<Class<?>, String> findResource(final String rsrcName) {
// Find by alias.
Class<?> cls = rsrcsByAlias.get(rsrcName);
if (cls != null)
return F.<Class<?>, String>t(cls, rsrcName);
// Find by class name.
cls = F.find(rsrcs, null, new P1<Class<?>>() {
@Override public boolean apply(Class<?> cls0) {
return cls0.getName().equals(rsrcName);
}
});
return cls != null ? F.<Class<?>, String>t(cls, null) : null;
}
/** {@inheritDoc} */
@Override public int hashCode() {
return clsLdr.hashCode();
}
/** {@inheritDoc} */
@Override public boolean equals(Object obj) {
return obj instanceof GridUriDeploymentUnitDescriptor &&
clsLdr.equals(((GridUriDeploymentUnitDescriptor)obj).clsLdr);
}
/** {@inheritDoc} */
@Override public String toString() {
return S.toString(GridUriDeploymentUnitDescriptor.class, this, "uri", U.hidePassword(uri));
}
}