Browse Source

migrate client code into common, add ModelSetupService and Unroll utility

tags/2.0.1
Jonathan Cobb 4 years ago
parent
commit
fb35a1d4e1
45 changed files with 147 additions and 35 deletions
  1. +0
    -1
      pom.xml
  2. +0
    -34
      wizard-client/pom.xml
  3. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/client/ApiClientBase.java
  4. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/client/script/ApiInnerScript.java
  5. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/client/script/ApiInnerScriptRunMode.java
  6. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/client/script/ApiMultiScriptDriver.java
  7. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/client/script/ApiRunner.java
  8. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/client/script/ApiRunnerListener.java
  9. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/client/script/ApiRunnerListenerBase.java
  10. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/client/script/ApiRunnerListenerStreamLogger.java
  11. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/client/script/ApiRunnerMultiListener.java
  12. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/client/script/ApiRunnerWithEnv.java
  13. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/client/script/ApiScript.java
  14. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/client/script/ApiScriptIncludeHandler.java
  15. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/client/script/ApiScriptIncludeHandlerBase.java
  16. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/client/script/ApiScriptRequest.java
  17. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/client/script/ApiScriptResponse.java
  18. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/client/script/ApiScriptResponseCheck.java
  19. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/client/script/ListenerFunction.java
  20. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/client/script/NamedApiConnectionInfo.java
  21. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/client/script/README.md
  22. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/client/script/SimpleApiRunnerListener.java
  23. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/main/MainApiBase.java
  24. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/main/MainApiOptionsBase.java
  25. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/main/MainBase.java
  26. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/main/ModelSetupMainBase.java
  27. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/main/ModelSetupOptionsBase.java
  28. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/main/ScriptMainBase.java
  29. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/main/ScriptMainOptionsBase.java
  30. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/ManifestClasspathResolver.java
  31. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/ManifestFileResolver.java
  32. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/ModelDiffEntry.java
  33. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/ModelEntity.java
  34. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/ModelManifestResolver.java
  35. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/ModelMigration.java
  36. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/ModelMigrationListener.java
  37. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/ModelSetup.java
  38. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/ModelSetupListener.java
  39. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/ModelSetupListenerBase.java
  40. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/ModelVerifyLog.java
  41. +0
    -0
      wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/StandardModelVerifyLog.java
  42. +0
    -0
      wizard-common/src/main/resources/org/cobbzilla/wizard/model/entityconfig/model_verify_template.html.hbs
  43. +125
    -0
      wizard-server/src/main/java/org/cobbzilla/wizard/ModelSetupService.java
  44. +16
    -0
      wizard-server/src/main/java/org/cobbzilla/wizard/Unroll.java
  45. +6
    -0
      wizard-server/src/main/java/org/cobbzilla/wizard/server/config/PgRestServerConfiguration.java

+ 0
- 1
pom.xml View File

@@ -20,7 +20,6 @@ cobbzilla-wizard is available under the Apache License, version 2: http://www.ap
<modules>
<module>wizard-common</module>
<module>wizard-server</module>
<module>wizard-client</module>
<module>wizard-server-test</module>
</modules>



+ 0
- 34
wizard-client/pom.xml View File

@@ -1,35 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>

<!--
(c) Copyright 2013-2014 Jonathan Cobb
This code is available under the Apache License, version 2: http://www.apache.org/licenses/LICENSE-2.0.html
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
<groupId>org.cobbzilla</groupId>
<artifactId>cobbzilla-wizard</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>

<artifactId>wizard-client</artifactId>
<version>1.0.0-SNAPSHOT</version>

<dependencies>

<dependency>
<groupId>org.cobbzilla</groupId>
<artifactId>wizard-common</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>

<dependency>
<groupId>org.cobbzilla</groupId>
<artifactId>cobbzilla-utils</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>

</dependencies>

</project>

wizard-client/src/main/java/org/cobbzilla/wizard/client/ApiClientBase.java → wizard-common/src/main/java/org/cobbzilla/wizard/client/ApiClientBase.java View File


wizard-client/src/main/java/org/cobbzilla/wizard/client/script/ApiInnerScript.java → wizard-common/src/main/java/org/cobbzilla/wizard/client/script/ApiInnerScript.java View File


wizard-client/src/main/java/org/cobbzilla/wizard/client/script/ApiInnerScriptRunMode.java → wizard-common/src/main/java/org/cobbzilla/wizard/client/script/ApiInnerScriptRunMode.java View File


wizard-client/src/main/java/org/cobbzilla/wizard/client/script/ApiMultiScriptDriver.java → wizard-common/src/main/java/org/cobbzilla/wizard/client/script/ApiMultiScriptDriver.java View File


wizard-client/src/main/java/org/cobbzilla/wizard/client/script/ApiRunner.java → wizard-common/src/main/java/org/cobbzilla/wizard/client/script/ApiRunner.java View File


wizard-client/src/main/java/org/cobbzilla/wizard/client/script/ApiRunnerListener.java → wizard-common/src/main/java/org/cobbzilla/wizard/client/script/ApiRunnerListener.java View File


wizard-client/src/main/java/org/cobbzilla/wizard/client/script/ApiRunnerListenerBase.java → wizard-common/src/main/java/org/cobbzilla/wizard/client/script/ApiRunnerListenerBase.java View File


wizard-client/src/main/java/org/cobbzilla/wizard/client/script/ApiRunnerListenerStreamLogger.java → wizard-common/src/main/java/org/cobbzilla/wizard/client/script/ApiRunnerListenerStreamLogger.java View File


wizard-client/src/main/java/org/cobbzilla/wizard/client/script/ApiRunnerMultiListener.java → wizard-common/src/main/java/org/cobbzilla/wizard/client/script/ApiRunnerMultiListener.java View File


wizard-client/src/main/java/org/cobbzilla/wizard/client/script/ApiRunnerWithEnv.java → wizard-common/src/main/java/org/cobbzilla/wizard/client/script/ApiRunnerWithEnv.java View File


wizard-client/src/main/java/org/cobbzilla/wizard/client/script/ApiScript.java → wizard-common/src/main/java/org/cobbzilla/wizard/client/script/ApiScript.java View File


wizard-client/src/main/java/org/cobbzilla/wizard/client/script/ApiScriptIncludeHandler.java → wizard-common/src/main/java/org/cobbzilla/wizard/client/script/ApiScriptIncludeHandler.java View File


wizard-client/src/main/java/org/cobbzilla/wizard/client/script/ApiScriptIncludeHandlerBase.java → wizard-common/src/main/java/org/cobbzilla/wizard/client/script/ApiScriptIncludeHandlerBase.java View File


wizard-client/src/main/java/org/cobbzilla/wizard/client/script/ApiScriptRequest.java → wizard-common/src/main/java/org/cobbzilla/wizard/client/script/ApiScriptRequest.java View File


wizard-client/src/main/java/org/cobbzilla/wizard/client/script/ApiScriptResponse.java → wizard-common/src/main/java/org/cobbzilla/wizard/client/script/ApiScriptResponse.java View File


wizard-client/src/main/java/org/cobbzilla/wizard/client/script/ApiScriptResponseCheck.java → wizard-common/src/main/java/org/cobbzilla/wizard/client/script/ApiScriptResponseCheck.java View File


wizard-client/src/main/java/org/cobbzilla/wizard/client/script/ListenerFunction.java → wizard-common/src/main/java/org/cobbzilla/wizard/client/script/ListenerFunction.java View File


wizard-client/src/main/java/org/cobbzilla/wizard/client/script/NamedApiConnectionInfo.java → wizard-common/src/main/java/org/cobbzilla/wizard/client/script/NamedApiConnectionInfo.java View File


wizard-client/src/main/java/org/cobbzilla/wizard/client/script/README.md → wizard-common/src/main/java/org/cobbzilla/wizard/client/script/README.md View File


wizard-client/src/main/java/org/cobbzilla/wizard/client/script/SimpleApiRunnerListener.java → wizard-common/src/main/java/org/cobbzilla/wizard/client/script/SimpleApiRunnerListener.java View File


wizard-client/src/main/java/org/cobbzilla/wizard/main/MainApiBase.java → wizard-common/src/main/java/org/cobbzilla/wizard/main/MainApiBase.java View File


wizard-client/src/main/java/org/cobbzilla/wizard/main/MainApiOptionsBase.java → wizard-common/src/main/java/org/cobbzilla/wizard/main/MainApiOptionsBase.java View File


wizard-client/src/main/java/org/cobbzilla/wizard/main/MainBase.java → wizard-common/src/main/java/org/cobbzilla/wizard/main/MainBase.java View File


wizard-client/src/main/java/org/cobbzilla/wizard/main/ModelSetupMainBase.java → wizard-common/src/main/java/org/cobbzilla/wizard/main/ModelSetupMainBase.java View File


wizard-client/src/main/java/org/cobbzilla/wizard/main/ModelSetupOptionsBase.java → wizard-common/src/main/java/org/cobbzilla/wizard/main/ModelSetupOptionsBase.java View File


wizard-client/src/main/java/org/cobbzilla/wizard/main/ScriptMainBase.java → wizard-common/src/main/java/org/cobbzilla/wizard/main/ScriptMainBase.java View File


wizard-client/src/main/java/org/cobbzilla/wizard/main/ScriptMainOptionsBase.java → wizard-common/src/main/java/org/cobbzilla/wizard/main/ScriptMainOptionsBase.java View File


wizard-client/src/main/java/org/cobbzilla/wizard/model/entityconfig/ManifestClasspathResolver.java → wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/ManifestClasspathResolver.java View File


wizard-client/src/main/java/org/cobbzilla/wizard/model/entityconfig/ManifestFileResolver.java → wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/ManifestFileResolver.java View File


wizard-client/src/main/java/org/cobbzilla/wizard/model/entityconfig/ModelDiffEntry.java → wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/ModelDiffEntry.java View File


wizard-client/src/main/java/org/cobbzilla/wizard/model/entityconfig/ModelEntity.java → wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/ModelEntity.java View File


wizard-client/src/main/java/org/cobbzilla/wizard/model/entityconfig/ModelManifestResolver.java → wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/ModelManifestResolver.java View File


wizard-client/src/main/java/org/cobbzilla/wizard/model/entityconfig/ModelMigration.java → wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/ModelMigration.java View File


wizard-client/src/main/java/org/cobbzilla/wizard/model/entityconfig/ModelMigrationListener.java → wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/ModelMigrationListener.java View File


wizard-client/src/main/java/org/cobbzilla/wizard/model/entityconfig/ModelSetup.java → wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/ModelSetup.java View File


wizard-client/src/main/java/org/cobbzilla/wizard/model/entityconfig/ModelSetupListener.java → wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/ModelSetupListener.java View File


wizard-client/src/main/java/org/cobbzilla/wizard/model/entityconfig/ModelSetupListenerBase.java → wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/ModelSetupListenerBase.java View File


wizard-client/src/main/java/org/cobbzilla/wizard/model/entityconfig/ModelVerifyLog.java → wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/ModelVerifyLog.java View File


wizard-client/src/main/java/org/cobbzilla/wizard/model/entityconfig/StandardModelVerifyLog.java → wizard-common/src/main/java/org/cobbzilla/wizard/model/entityconfig/StandardModelVerifyLog.java View File


wizard-client/src/main/resources/org/cobbzilla/wizard/model/entityconfig/model_verify_template.html.hbs → wizard-common/src/main/resources/org/cobbzilla/wizard/model/entityconfig/model_verify_template.html.hbs View File


+ 125
- 0
wizard-server/src/main/java/org/cobbzilla/wizard/ModelSetupService.java View File

@@ -0,0 +1,125 @@
package org.cobbzilla.wizard;

import com.fasterxml.jackson.databind.JsonNode;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.cobbzilla.util.io.FileUtil;
import org.cobbzilla.wizard.api.CrudOperation;
import org.cobbzilla.wizard.client.ApiClientBase;
import org.cobbzilla.wizard.model.Identifiable;
import org.cobbzilla.wizard.model.entityconfig.EntityConfig;
import org.cobbzilla.wizard.model.entityconfig.ManifestFileResolver;
import org.cobbzilla.wizard.model.entityconfig.ModelSetup;
import org.cobbzilla.wizard.model.entityconfig.ModelSetupListenerBase;
import org.cobbzilla.wizard.server.config.PgRestServerConfiguration;

import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import static org.cobbzilla.util.daemon.ZillaRuntime.now;
import static org.cobbzilla.util.daemon.ZillaRuntime.shortError;
import static org.cobbzilla.util.io.FileUtil.extension;
import static org.cobbzilla.util.json.JsonUtil.json;
import static org.cobbzilla.util.json.JsonUtil.newArrayNode;
import static org.cobbzilla.wizard.Unroll.unrollOrInvalid;
import static org.cobbzilla.wizard.resources.ResourceUtil.invalidEx;

public abstract class ModelSetupService {

protected abstract PgRestServerConfiguration getConfiguration();
protected abstract String getEntityConfigsEndpoint();
protected abstract void setOwner(Identifiable owner, Identifiable entity);

public Map<CrudOperation, Collection<Identifiable>> setupModel(Identifiable owner, File modelFile) {
File modelDir;
final String ext = extension(modelFile);
switch (ext.toLowerCase()) {
case ".zip": case ".gz": case ".tgz":
modelDir = unrollOrInvalid(modelFile, "err.entity.fileZipFormat.invalid");
break;
case ".json":
modelDir = null;
break;
default: throw invalidEx("err.entity.filenameExtension.invalid");
}

final LinkedHashMap<String, String> models = new LinkedHashMap<>();

final ManifestFileResolver resolver;
if (modelDir == null) {
resolver = null;

// It's a JSON file, determine type
final String filename = modelFile.getName();
final int dotPos = filename.indexOf('.');
final int uPos = filename.indexOf('_');
final String entityClassInFilename = filename.substring(0, Math.min(dotPos == -1 ? filename.length() : dotPos, uPos == -1 ? filename.length() : uPos));
final Class<? extends Identifiable> entityClass = getConfiguration().getEntityClasses().stream()
.filter(c -> c.getSimpleName().equalsIgnoreCase(entityClassInFilename))
.findFirst().orElse(null);
if (entityClass == null) throw invalidEx("err.entity.classInFilename.invalid");

// Does the file contain a single object? if so, wrap in array
final JsonNode node = json(FileUtil.toStringOrDie(modelFile), JsonNode.class);
if (!node.isArray()) {
final JsonNode arrayNode = newArrayNode().add(node);
models.put(entityClass.getName(), json(arrayNode));
} else {
models.put(entityClass.getName(), json(node));
}
} else {
resolver = new ManifestFileResolver(modelDir);
final File manifest = new File(modelDir, "manifest.json");
if (!manifest.exists()) {
throw invalidEx("err.entity.manifest.required");
}
models.put("manifest", manifest.getName());
}

try {
final ApiClientBase api = getConfiguration().newApiClient();
final ModelSetupForOwner setup = new ModelSetupForOwner(owner);
return setup.setup(api, models, resolver);

} catch (Exception e) {
throw invalidEx("err.entity.setupError", shortError(e));
}
}

@AllArgsConstructor
private class ModelSetupForOwner extends ModelSetupListenerBase {

private final Identifiable owner;
@Getter private final Map<CrudOperation, Collection<Identifiable>> status = new ConcurrentHashMap<>();

@Override public void preCreate(EntityConfig entityConfig, Identifiable entity) {
setOwner(owner, entity);
super.preCreate(entityConfig, entity);
}

@Override public void postCreate(EntityConfig entityConfig, Identifiable entity, Identifiable created) {
status.computeIfAbsent(CrudOperation.create, k -> new ArrayList<>()).add(created);
}

@Override public void preUpdate(EntityConfig entityConfig, Identifiable entity) {
setOwner(owner, entity);
super.preUpdate(entityConfig, entity);
}

@Override public void postUpdate(EntityConfig entityConfig, Identifiable entity, Identifiable updated) {
status.computeIfAbsent(CrudOperation.update, k -> new ArrayList<>()).add(updated);
}

public Map<CrudOperation, Collection<Identifiable>> setup(ApiClientBase api,
LinkedHashMap<String, String> models,
ManifestFileResolver resolver) throws Exception {
ModelSetup.setupModel(api, getEntityConfigsEndpoint(), models,
resolver, this, true, getClass().getName()+"_"+ owner.getUuid()+"_"+now());
return status;
}
}
}

+ 16
- 0
wizard-server/src/main/java/org/cobbzilla/wizard/Unroll.java View File

@@ -0,0 +1,16 @@
package org.cobbzilla.wizard;

import org.cobbzilla.util.io.TempDir;

import java.io.File;

import static org.cobbzilla.util.io.Decompressors.unroll;
import static org.cobbzilla.wizard.resources.ResourceUtil.invalidEx;

public class Unroll {

public static TempDir unrollOrInvalid (File file, String err) {
try { return unroll(file); } catch (Exception e) { throw invalidEx(err); }
}

}

+ 6
- 0
wizard-server/src/main/java/org/cobbzilla/wizard/server/config/PgRestServerConfiguration.java View File

@@ -8,6 +8,7 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.exec.CommandLine;
import org.cobbzilla.util.collection.ArrayUtil;
import org.cobbzilla.util.collection.NameAndValue;
import org.cobbzilla.util.http.ApiConnectionInfo;
import org.cobbzilla.util.io.FileUtil;
import org.cobbzilla.util.jdbc.DbDumpMode;
import org.cobbzilla.util.jdbc.ResultSetBean;
@@ -15,6 +16,7 @@ import org.cobbzilla.util.jdbc.UncheckedSqlException;
import org.cobbzilla.util.string.StringUtil;
import org.cobbzilla.util.system.Command;
import org.cobbzilla.util.system.CommandResult;
import org.cobbzilla.wizard.client.ApiClientBase;
import org.cobbzilla.wizard.model.Identifiable;
import org.cobbzilla.wizard.model.entityconfig.EntityReferences;
import org.springframework.context.annotation.Bean;
@@ -336,4 +338,8 @@ public class PgRestServerConfiguration extends RestServerConfiguration implement
.generateConstraintSql(includeIndexes).toArray(new String[0]);
}

// warning: default ApiClientBase does not have an auth header set, will not work.
// override in subclass
public ApiClientBase newApiClient() { return new ApiClientBase(new ApiConnectionInfo(getLoopbackApiBase())); }

}

Loading…
Cancel
Save