import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.LambdaLogger;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.S3Event;
import javafx.util.Pair;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.ruby.codeInsight.types.signature.RSignature;
import org.jetbrains.ruby.codeInsight.types.storage.server.RSignatureStorageServer;
import org.jetbrains.ruby.codeInsight.types.storage.server.RSignatureStorageServerImpl;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URL;
import java.sql.SQLException;
import java.util.HashSet;
import java.util.List;
import java.util.Properties;
public class LambdaFunctionHandler implements RequestHandler<S3Event, Object> {
@Override
public Object handleRequest(@NotNull final S3Event event, @NotNull final Context context) {
final LambdaLogger logger = context.getLogger();
logger.log("Input: " + event);
try {
final Properties properties = getProperties();
final RSignatureStorageServer server = new RSignatureStorageServerImpl(
properties.getProperty("host"), properties.getProperty("port"),
properties.getProperty("login"), properties.getProperty("password"),
properties.getProperty("dbName"));
final List<Pair<String, String>> gemNamesAndVersions = server.getGemNamesAndVersionsFromStorage();
for (final Pair<String, String> gemNameAndVersion : gemNamesAndVersions) {
final String gemName = gemNameAndVersion.getKey();
final String gemVersion = gemNameAndVersion.getValue();
final List<RSignature> signatures = server.getSignaturesFromStorage(gemName, gemVersion);
final String statFileName = String.format("%s-%s.json", gemName, gemVersion);
final List<RSignature> signaturesFromStatFile = server.getSignaturesFromStatFile(statFileName, true);
if (!(new HashSet<>(signatures)).equals(new HashSet<>(signaturesFromStatFile))) {
server.insertSignaturesToStatFile(signatures, statFileName, true);
}
}
} catch (IOException | SQLException | ClassNotFoundException e) {
logger.log(e.toString());
return "FAIL";
}
return "OK";
}
@NotNull
private static Properties getProperties() throws IOException {
final String PROPERTIES_FILE = "aws.properties";
final Properties properties = new Properties();
final URL propertiesURL = LambdaFunctionHandler.class.getClassLoader().getResource(PROPERTIES_FILE);
if (propertiesURL == null) {
throw new FileNotFoundException("File " + PROPERTIES_FILE + " not found");
}
final String propertiesPath = propertiesURL.getPath();
properties.load(new FileInputStream(propertiesPath));
return properties;
}
}