blob: e46a50e18df58205213e76aae605057f4a4c5f02 [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.hadoop.fs;
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import org.apache.ignite.hadoop.util.KerberosUserNameMapper;
import org.apache.ignite.hadoop.util.UserNameMapper;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.jetbrains.annotations.Nullable;
/**
* Simple Hadoop file system factory which delegates to {@code FileSystem.get()} on each call.
* <p>
* If {@code "fs.[prefix].impl.disable.cache"} is set to {@code true}, file system instances will be cached by Hadoop.
*/
public class BasicHadoopFileSystemFactory implements HadoopFileSystemFactory, Externalizable {
/** */
private static final long serialVersionUID = 0L;
/** File system URI. */
private String uri;
/** File system config paths. */
private String[] cfgPaths;
/** User name mapper. */
private UserNameMapper usrNameMapper;
/**
* Constructor.
*/
public BasicHadoopFileSystemFactory() {
// No-op.
}
/** {@inheritDoc} */
@Override public final Object get(String name) throws IOException {
throw new UnsupportedOperationException("Method should not be called directly.");
}
/**
* Gets file system URI.
* <p>
* This URI will be used as a first argument when calling {@code FileSystem.get(URI, Configuration, String)}.
* <p>
* If not set, default URI will be picked from file system configuration using
* {@code FileSystem.getDefaultUri(Configuration)} method.
*
* @return File system URI.
*/
@Nullable public String getUri() {
return uri;
}
/**
* Sets file system URI. See {@link #getUri()} for more information.
*
* @param uri File system URI.
*/
public void setUri(@Nullable String uri) {
this.uri = uri;
}
/**
* Gets paths to additional file system configuration files (e.g. core-site.xml).
* <p>
* Path could be either absolute or relative to {@code IGNITE_HOME} environment variable.
* <p>
* All provided paths will be loaded in the order they provided and then applied to {@code Configuration}. It means
* that path order might be important in some cases.
*
* @return Paths to file system configuration files.
*/
@Nullable public String[] getConfigPaths() {
return cfgPaths;
}
/**
* Set paths to additional file system configuration files (e.g. core-site.xml). See {@link #getConfigPaths()} for
* more information.
*
* @param cfgPaths Paths to file system configuration files.
*/
public void setConfigPaths(@Nullable String... cfgPaths) {
this.cfgPaths = cfgPaths;
}
/**
* Get optional user name mapper.
* <p>
* When IGFS is invoked from Hadoop, user name is passed along the way to ensure that request will be performed
* with proper user context. User name is passed in a simple form and doesn't contain any extended information,
* such as host, domain or Kerberos realm. You may use name mapper to translate plain user name to full user
* name required by security engine of the underlying file system.
* <p>
* For example you may want to use {@link KerberosUserNameMapper} to user name from {@code "johndoe"} to
* {@code "johndoe@YOUR.REALM.COM"}.
*
* @return User name mapper.
*/
@Nullable public UserNameMapper getUserNameMapper() {
return usrNameMapper;
}
/**
* Set optional user name mapper. See {@link #getUserNameMapper()} for more information.
*
* @param usrNameMapper User name mapper.
*/
public void setUserNameMapper(@Nullable UserNameMapper usrNameMapper) {
this.usrNameMapper = usrNameMapper;
}
/** {@inheritDoc} */
@Override public void writeExternal(ObjectOutput out) throws IOException {
U.writeString(out, uri);
if (cfgPaths != null) {
out.writeInt(cfgPaths.length);
for (String cfgPath : cfgPaths)
U.writeString(out, cfgPath);
}
else
out.writeInt(-1);
out.writeObject(usrNameMapper);
}
/** {@inheritDoc} */
@Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
uri = U.readString(in);
int cfgPathsCnt = in.readInt();
if (cfgPathsCnt != -1) {
cfgPaths = new String[cfgPathsCnt];
for (int i = 0; i < cfgPathsCnt; i++)
cfgPaths[i] = U.readString(in);
}
usrNameMapper = (UserNameMapper)in.readObject();
}
}