String line = reader.readLine();
if (line == null) break;
contents.append(line).append('\n');
}
if (!Pattern.compile(DESCRIPTOR_FILE, Pattern.DOTALL).matcher(contents).matches())
throw new InvalidSQLJDeploymentDescriptorException(jarName, "Incorrect file format");
String header, footer;
if (undeploy) {
header = BEGIN_REMOVE;
footer = END_REMOVE;
}
else {
header = BEGIN_INSTALL;
footer = END_INSTALL;
}
int start = contents.indexOf(header);
if (start < 0)
throw new InvalidSQLJDeploymentDescriptorException(jarName, "Actions not found");
start += header.length();
int end = contents.indexOf(footer, start);
if (end < 0)
throw new InvalidSQLJDeploymentDescriptorException(jarName, "Actions not terminated");
String sql = contents.substring(start, end);
List<StatementNode> stmts;
try {
stmts = server.getParser().parseStatements(sql);
}
catch (SQLParserException ex) {
throw new InvalidSQLJDeploymentDescriptorException(jarName, ex);
}
catch (StandardException ex) {
throw new InvalidSQLJDeploymentDescriptorException(jarName, ex);
}
int nstmts = stmts.size();
List<DDLStatementNode> ddls = new ArrayList<>(nstmts);
List<String> sqls = new ArrayList<>(nstmts);
for (StatementNode stmt : stmts) {
boolean stmtOkay = false, thisjarOkay = false;
if (undeploy) {
if (stmt instanceof DropAliasNode) {
DropAliasNode dropAlias = (DropAliasNode)stmt;
switch (dropAlias.getAliasType()) {
case PROCEDURE:
case FUNCTION:
stmtOkay = true;
{
TableName routineName = DDLHelper.convertName(server.getDefaultSchemaName(), dropAlias.getObjectName());
Routine routine = server.getAIS().getRoutine(routineName);
if (routine != null) {
SQLJJar sqljjar = routine.getSQLJJar();
thisjarOkay = ((sqljjar != null) &&
jarName.equals(sqljjar.getName()));
}
}
break;
}
}
}
else {
if (stmt instanceof CreateAliasNode) {
CreateAliasNode createAlias = (CreateAliasNode)stmt;
switch (createAlias.getAliasType()) {
case PROCEDURE:
case FUNCTION:
stmtOkay = true;
if ((createAlias.getJavaClassName() != null) &&
createAlias.getJavaClassName().startsWith("thisjar:")) {
createAlias.setUserData(jarName);
thisjarOkay = true;
}
break;
}
}
}
if (!stmtOkay)
throw new InvalidSQLJDeploymentDescriptorException(jarName, "Statement not allowed " + stmt.statementToString());
if (!thisjarOkay)
throw new InvalidSQLJDeploymentDescriptorException(jarName, "Must refer to thisjar:");
ddls.add((DDLStatementNode)stmt);
sqls.add(sql.substring(stmt.getBeginOffset(), stmt.getEndOffset() + 1));
}
for (int i = 0; i < nstmts; i++) {
AISDDL.execute(ddls.get(i), sqls.get(i), context);