PageRenderTime 62ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 1ms

/cli/src/main/java/org/cmdbuild/utils/cli/commands/RestCommandRunner.java

https://bitbucket.org/tecnoteca/cmdbuild
Java | 1055 lines | 920 code | 117 blank | 18 comment | 39 complexity | 2de284f0f6c2c3cf31e00794a83ec942 MD5 | raw file
Possible License(s): AGPL-3.0
  1. /*
  2. * To change this license header, choose License Headers in Project Properties.
  3. * To change this template file, choose Tools | Templates
  4. * and open the template in the editor.
  5. */
  6. package org.cmdbuild.utils.cli.commands;
  7. import static com.google.common.base.MoreObjects.firstNonNull;
  8. import static com.google.common.base.Objects.equal;
  9. import static com.google.common.base.Preconditions.checkArgument;
  10. import static com.google.common.base.Predicates.not;
  11. import com.google.common.base.Splitter;
  12. import static com.google.common.base.Strings.emptyToNull;
  13. import static com.google.common.base.Strings.nullToEmpty;
  14. import com.google.common.collect.Maps;
  15. import static com.google.common.collect.Maps.filterKeys;
  16. import com.google.common.collect.Ordering;
  17. import static com.google.common.io.Files.toByteArray;
  18. import com.google.common.net.UrlEscapers;
  19. import java.awt.Desktop;
  20. import java.io.BufferedReader;
  21. import java.io.ByteArrayInputStream;
  22. import java.io.File;
  23. import java.io.FileInputStream;
  24. import java.io.FileNotFoundException;
  25. import java.io.IOException;
  26. import java.io.InputStream;
  27. import java.io.InputStreamReader;
  28. import java.io.StringReader;
  29. import static java.lang.String.format;
  30. import java.net.URLDecoder;
  31. import static java.util.Collections.emptyMap;
  32. import java.util.Iterator;
  33. import java.util.List;
  34. import java.util.Map;
  35. import java.util.Properties;
  36. import static java.util.stream.Collectors.joining;
  37. import javax.annotation.Nullable;
  38. import javax.xml.parsers.DocumentBuilderFactory;
  39. import javax.xml.xpath.XPathFactory;
  40. import org.apache.commons.cli.CommandLine;
  41. import org.apache.commons.cli.Option;
  42. import org.apache.commons.cli.Options;
  43. import org.apache.commons.io.FileUtils;
  44. import org.apache.commons.io.IOUtils;
  45. import static org.apache.commons.lang3.StringUtils.abbreviate;
  46. import static org.apache.commons.lang3.StringUtils.isBlank;
  47. import static org.apache.commons.lang3.StringUtils.isNotBlank;
  48. import static org.apache.commons.lang3.StringUtils.trimToNull;
  49. import org.cmdbuild.audit.RequestData;
  50. import org.cmdbuild.audit.RequestInfo;
  51. import org.cmdbuild.auth.login.file.FileAuthUtils.AuthFile;
  52. import static org.cmdbuild.auth.login.file.FileAuthUtils.buildAuthFile;
  53. import org.cmdbuild.client.rest.RestClient;
  54. import static org.cmdbuild.client.rest.RestClientImpl.build;
  55. import org.cmdbuild.client.rest.api.AttachmentApi.AttachmentData;
  56. import org.cmdbuild.client.rest.api.AttachmentApi.AttachmentPreview;
  57. import org.cmdbuild.client.rest.api.ClassApi;
  58. import org.cmdbuild.client.rest.api.SessionApi.SessionInfo;
  59. import org.cmdbuild.client.rest.api.SystemApi.LoggerInfo;
  60. import org.cmdbuild.client.rest.api.WokflowApi.FlowDataAndStatus;
  61. import org.cmdbuild.client.rest.api.WokflowApi.TaskDetail;
  62. import org.cmdbuild.client.rest.model.Attachment;
  63. import org.cmdbuild.client.rest.model.Card;
  64. import org.cmdbuild.client.rest.model.SimpleCard;
  65. import org.cmdbuild.client.rest.model.SimpleFlowData;
  66. import org.cmdbuild.config.api.ConfigDefinition;
  67. import org.cmdbuild.startup.SystemStatus;
  68. import org.cmdbuild.utils.cli.CliSessionVariables;
  69. import org.cmdbuild.utils.cli.commands.restcommandutils.CliAction;
  70. import org.cmdbuild.utils.cli.commands.restcommandutils.CliCommand;
  71. import org.cmdbuild.utils.cli.commands.restcommandutils.CliCommandParser;
  72. import static org.cmdbuild.utils.xml.CmdbuildXmlUtils.prettifyIfXml;
  73. import org.cmdbuild.client.rest.api.LookupApi;
  74. import org.cmdbuild.client.rest.api.SystemApi;
  75. import org.cmdbuild.client.rest.api.WokflowApi;
  76. import org.cmdbuild.client.rest.model.AttributeData;
  77. import org.cmdbuild.client.rest.model.AttributeRequestData;
  78. import org.cmdbuild.client.rest.model.ClassData;
  79. import org.cmdbuild.client.rest.model.CustomPageInfo;
  80. import org.cmdbuild.client.rest.model.SimpleAttributeRequestData;
  81. import org.cmdbuild.client.rest.model.SimpleClassData;
  82. import static org.cmdbuild.common.http.HttpConst.CMDBUILD_WFY_PASSTOKEN_HEADER_OR_COOKIE;
  83. import static org.cmdbuild.common.http.HttpConst.WFY_PASSTOKEN_DEFAULT;
  84. import org.cmdbuild.dao.entrytype.AttributePermissionMode;
  85. import static org.cmdbuild.utils.io.CmdbuildFileUtils.readToString;
  86. import static org.cmdbuild.utils.lang.CmdbConvertUtils.toBooleanOrDefault;
  87. import static org.cmdbuild.utils.lang.CmdbConvertUtils.toIntegerOrNull;
  88. import static org.cmdbuild.utils.lang.CmdbMapUtils.map;
  89. import org.cmdbuild.report.ReportConst.ReportExtension;
  90. import org.cmdbuild.report.ReportInfo;
  91. import org.cmdbuild.report.ReportInfoImpl;
  92. import static org.cmdbuild.utils.cli.Main.getWarFile;
  93. import static org.cmdbuild.utils.cli.Main.isRunningFromWebappDir;
  94. import org.cmdbuild.utils.cli.commands.restcommandutils.CliCommandUtils;
  95. import static org.cmdbuild.utils.cli.commands.restcommandutils.CliCommandUtils.prepareAction;
  96. import static org.cmdbuild.utils.date.DateUtils.dateTimeFileSuffix;
  97. import static org.cmdbuild.utils.date.DateUtils.getReadableTimezoneOffset;
  98. import static org.cmdbuild.utils.io.CmdbuildFileUtils.sysTmpDir;
  99. import static org.cmdbuild.utils.io.CmdbuildFileUtils.writeToFile;
  100. import static org.cmdbuild.utils.io.CmdbuildZipUtils.dirToZip;
  101. import static org.cmdbuild.utils.json.CmJsonUtils.prettifyIfJson;
  102. import static org.cmdbuild.utils.lang.CmdbCollectionUtils.list;
  103. import static org.cmdbuild.utils.lang.CmdbConvertUtils.toLong;
  104. import static org.cmdbuild.utils.lang.CmdbNullableUtils.firstNotNull;
  105. import static org.cmdbuild.utils.lang.CmdbPreconditions.checkNotBlank;
  106. import static org.cmdbuild.utils.random.CmdbuildRandomUtils.randomId;
  107. import org.w3c.dom.Document;
  108. import org.cmdbuild.debuginfo.BugReportInfo;
  109. import static org.cmdbuild.utils.cli.Main.isRunningFromWarFile;
  110. import static org.cmdbuild.utils.cli.utils.FileEditor.editFile;
  111. import static org.cmdbuild.utils.io.CmdbuildFileUtils.tempDir;
  112. import static org.cmdbuild.utils.lang.CmdbPreconditions.firstNotBlank;
  113. import static org.cmdbuild.utils.date.DateUtils.toUserReadableDateTime;
  114. public class RestCommandRunner extends AbstractCommandRunner {
  115. private final Map<String, CliAction> actions;
  116. private String username, password, baseUrl;
  117. private RestClient client;
  118. public RestCommandRunner() {
  119. super("restws", "test cmdbuild rest ws");
  120. actions = new CliCommandParser().parseActions(this);
  121. }
  122. @Override
  123. protected Options buildOptions() {
  124. Options options = super.buildOptions();
  125. options.addOption("url", true, "set cmdbuild root url for rest ws (default is 'http://localhost:8080/cmdbuild/')");
  126. options.addOption("username", true, "set ws username (default is 'admin')");
  127. options.addOption("password", true, "set ws password (default is 'admin')");
  128. options.addOption(Option.builder("wfy").optionalArg(true).desc("enable wfy client mode (with optional passtoken)").build());
  129. return options;
  130. }
  131. @Override
  132. protected void printAdditionalHelp() {
  133. super.printAdditionalHelp();
  134. System.out.println("\navailable rest methods:");
  135. actions.values().stream().distinct().sorted(Ordering.natural().onResultOf(CliAction::getHelpAliases)).forEach((action -> {
  136. System.out.printf("\t%-32s\t%s\n", action.getHelpAliases(), action.getHelpParameters());
  137. }));
  138. }
  139. @Override
  140. protected void exec(CommandLine cmd) throws Exception {
  141. baseUrl = getBaseUrl(cmd.getOptionValue("url"));
  142. logger.debug("selected base url = {}", baseUrl);
  143. username = firstNonNull(cmd.getOptionValue("username"), "admin");
  144. password = cmd.getOptionValue("password");
  145. if (isBlank(password)) {
  146. if (baseUrl.matches(".*://localhost:.*") && isRunningFromWebappDir()) {
  147. AuthFile authFile = tryToBuildFilePassword();
  148. if (authFile != null) {
  149. logger.debug("authenticating with file password = {}", authFile.getFile().getAbsolutePath());
  150. authFile.getFile().deleteOnExit();
  151. password = authFile.getPassword();
  152. }
  153. }
  154. }
  155. if (isBlank(password)) {
  156. password = "admin";
  157. }
  158. Iterator<String> iterator = cmd.getArgList().iterator();
  159. if (!iterator.hasNext()) {
  160. System.out.println("no rest call requested, doing nothing...");
  161. } else {
  162. CliCommandUtils.ExecutableAction action = prepareAction(actions, iterator);
  163. client = build(baseUrl).withActionId("cli_restws_" + action.getAction().getName());
  164. if (cmd.hasOption("wfy")) {
  165. String wfyPasstoken = firstNotNull(trimToNull(cmd.getOptionValue("wfy")), WFY_PASSTOKEN_DEFAULT);
  166. client.withHeader(CMDBUILD_WFY_PASSTOKEN_HEADER_OR_COOKIE, wfyPasstoken);
  167. }
  168. try {
  169. action.execute();
  170. } finally {
  171. client.close();
  172. }
  173. }
  174. }
  175. private @Nullable
  176. AuthFile tryToBuildFilePassword() {
  177. try {
  178. File authDir = new File(getWarFile(), "../../temp/");
  179. return buildAuthFile(authDir);
  180. } catch (Exception ex) {
  181. logger.error("error building file password", ex);
  182. return null;
  183. }
  184. }
  185. private String getBaseUrl(@Nullable String urlParam) {
  186. if (isNotBlank(urlParam)) {
  187. return urlParam;
  188. } else {
  189. int port = 8080;
  190. String webapp = "cmdbuild";
  191. if (isRunningFromWebappDir()) {
  192. try {
  193. webapp = getWarFile().getCanonicalFile().getName();
  194. File tomcatConf = new File(getWarFile(), "../../conf/server.xml");
  195. if (tomcatConf.exists()) {
  196. Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(tomcatConf);
  197. port = Integer.valueOf(checkNotBlank(XPathFactory.newInstance().newXPath().compile("string(//*[local-name()='Connector'][@protocol='HTTP/1.1']/@port)").evaluate(document)));
  198. logger.debug("selected tomcat port = {}", port);
  199. }
  200. } catch (Exception ex) {
  201. logger.error("error processing tomcat config file", ex);
  202. }
  203. }
  204. return format("http://localhost:%s/%s/", port, webapp);
  205. }
  206. }
  207. @CliCommand
  208. protected void curl() {
  209. System.out.printf(buildCurlCli(client.doLoginWithAnyGroup(username, password).getSessionToken(), "services/rest/v3/"));
  210. }
  211. @CliCommand
  212. protected void status() {
  213. SystemStatus systemStatus = client.system().getStatus();
  214. System.out.println("system status: " + systemStatus);
  215. }
  216. @CliCommand
  217. protected void dump() throws IOException {
  218. byte[] data = client.doLoginWithAnyGroup(username, password).system().dumpDatabase();
  219. System.out.write(data);
  220. }
  221. @CliCommand(alias = {"debug", "downloadDebugInfo", "downloadBugreport"})
  222. protected void debugInfo() throws IOException {
  223. byte[] data = client.doLoginWithAnyGroup(username, password).system().downloadDebugInfo();
  224. if (System.console() == null) {
  225. System.out.write(data);
  226. } else {
  227. File outputFile = new File(format("debug_%s.zip", dateTimeFileSuffix()));
  228. checkArgument(!outputFile.exists());
  229. FileUtils.writeByteArrayToFile(outputFile, data);
  230. System.out.printf("output written to %s %s\n", outputFile.getAbsolutePath(), FileUtils.byteCountToDisplaySize(outputFile.length()));
  231. }
  232. }
  233. @CliCommand("sendbugreport")
  234. protected void bugreport() throws IOException {
  235. System.out.printf("bug report message: ");
  236. String message = new BufferedReader(new InputStreamReader(System.in)).readLine();
  237. System.out.println("sending bug report");
  238. BugReportInfo debugInfo = client.doLoginWithAnyGroup(username, password).system().sendBugReport(message);
  239. System.out.printf("bug report sent, file name = %s\n", debugInfo.getFileName());
  240. }
  241. @CliCommand
  242. protected void eval(String script) {
  243. if (new File(script).isFile()) {
  244. script = readToString(new File(script));
  245. }
  246. client.doLoginWithAnyGroup(username, password).system().eval(script);
  247. //TODO parse response, return something
  248. }
  249. @CliCommand
  250. protected void urlEncode(String val) {
  251. System.out.println(UrlEscapers.urlFormParameterEscaper().escape(val));
  252. }
  253. @CliCommand
  254. protected void urlDecode(String val) {
  255. System.out.println(URLDecoder.decode(val));
  256. }
  257. @CliCommand
  258. protected void test() {
  259. boolean ok = true;
  260. try {
  261. SessionInfo sessionInfo = client.doLoginWithAnyGroup(username, password).session().getSessionInfo();
  262. logger.info("current session info = {}", sessionInfo);
  263. } catch (Exception ex) {
  264. logger.error("error", ex);
  265. ok = false;
  266. }
  267. System.out.println("test " + (ok ? "OK" : "ERROR"));
  268. }
  269. @CliCommand
  270. protected void getSessionToken() {
  271. SessionInfo sessionInfo = client.doLoginWithAnyGroup(username, password).session().getSessionInfo();
  272. System.out.println(sessionInfo.getSessionToken());
  273. }
  274. @CliCommand(alias = {"lookupValues", "lookup", "getlookup"})
  275. protected void getLookupValues(String lookupTypeId) {
  276. List<LookupApi.LookupValue> values = client.doLoginWithAnyGroup(username, password).lookup().getValues(lookupTypeId);
  277. System.out.println("received lookup values for type: " + lookupTypeId);
  278. values.forEach((value) -> {
  279. System.out.format("\t%-16s\t%-16s\t%s\n", value.getId(), value.getCode(), value.getDescription());
  280. });
  281. }
  282. @CliCommand("class")
  283. protected void getClass(String classId) {
  284. ClassApi api = client.doLoginWithAnyGroup(username, password).classe();
  285. ClassData classeData = api.getById(classId);
  286. System.out.println("received class for id: " + classeData.getId() + "\n");
  287. printClass(classeData);
  288. List<AttributeData> attributes = api.getAttributes(classId);
  289. System.out.println("\nclass attributes: \n");
  290. attributes.forEach((attr) -> {
  291. System.out.printf("\t%-16s\t%s\n", attr.getName(), attr.getType());
  292. });
  293. }
  294. @CliCommand
  295. protected void editClass(String classId) {
  296. ClassApi classApi = client.doLoginWithAnyGroup(username, password).classe();
  297. String classJsonData = classApi.getRawJsonById(classId);
  298. String modifiedData = editFile(classJsonData, "class", "json");
  299. if (!equal(classJsonData, modifiedData)) {
  300. ClassData classData = classApi.update(classId, modifiedData).getClasse();
  301. System.out.println("updated classe for id: " + classData.getId());
  302. }
  303. }
  304. @CliCommand("classes")
  305. protected void getClasses() {
  306. List<ClassData> classes = client.doLoginWithAnyGroup(username, password).classe().getAll();
  307. System.out.println("received class data for " + classes.size() + " classes:");
  308. classes.forEach((classeData) -> {
  309. System.out.println();
  310. printClass(classeData);
  311. });
  312. }
  313. @CliCommand
  314. protected void createClass(String classId, Map<String, String> data) {
  315. ClassData classData = cliToClassData(classId, data);
  316. classData = client.doLoginWithAnyGroup(username, password).classe().create(classData).getClasse();
  317. System.out.println("created classe for id: " + classData.getId());
  318. printClass(classData);
  319. }
  320. @CliCommand
  321. protected void updateClass(String classId, Map<String, String> data) {
  322. ClassData classData = cliToClassData(classId, data);
  323. classData = client.doLoginWithAnyGroup(username, password).classe().update(classData).getClasse();
  324. System.out.println("updated classe for id: " + classData.getId());
  325. printClass(classData);
  326. }
  327. @CliCommand
  328. protected void deleteClass(String classId) {
  329. client.doLoginWithAnyGroup(username, password).classe().deleteById(classId);
  330. System.out.println("deleted class for id: " + classId);
  331. }
  332. @CliCommand(alias = {"getAttr", "readAttr", "readAttribute"})
  333. protected void getAttribute(String classId, String attrId) {
  334. AttributeData attributeData = client.doLoginWithAnyGroup(username, password).classe().getAttr(classId, attrId);
  335. System.out.println("get attr for id: " + attributeData.getName());
  336. printAttribute(attributeData);
  337. }
  338. @CliCommand("createAttr")
  339. protected void createAttribute(String classId, Map<String, String> data) {
  340. AttributeRequestData requestData = paramToAttrData(data.get("name"), data);
  341. AttributeData attributeData = client.doLoginWithAnyGroup(username, password).classe().createAttr(classId, requestData).getAttr();
  342. System.out.println("created attr for id: " + attributeData.getName());
  343. printAttribute(attributeData);
  344. }
  345. @CliCommand("updateAttr")
  346. protected void updateAttribute(String classId, String attrId, Map<String, String> data) {
  347. AttributeRequestData requestData = paramToAttrData(attrId, data);
  348. AttributeData attributeData = client.doLoginWithAnyGroup(username, password).classe().updateAttr(classId, requestData).getAttr();
  349. System.out.println("updated attr for id: " + attributeData.getName());
  350. printAttribute(attributeData);
  351. }
  352. @CliCommand("deleteAttr")
  353. protected void deleteAttribute(String classId, String attrId) {
  354. client.doLoginWithAnyGroup(username, password).classe().deleteAttr(classId, attrId);
  355. System.out.println("deleted attr for id: " + attrId);
  356. }
  357. private void printAttribute(AttributeData attr) {
  358. System.out.printf("\t%-16s\t%s\n", attr.getName(), attr.getType());//TODO
  359. // {"success":true,"data":{"type":"string","name":"Description","description":"Description","displayableInList":true,"domainName":null,"unique":true,"mandatory":true,"inherited":true,"active":true,"index":2,"defaultValue":null,"group":"","precision":null,"scale":null,"targetClass":null,"targetType":null,"length":250,"editorType":null,"filter":null,"values":[],"writable":true,"hidden":false,"metadata":{},"classOrder":null,"ipType":null,"lookupType":null,"_id":"Description"}}
  360. }
  361. private AttributeRequestData paramToAttrData(String attrId, Map<String, String> data) {
  362. return SimpleAttributeRequestData.builder()
  363. .withActive(toBooleanOrDefault(data.get("active"), true))
  364. .withDescription(firstNonNull(data.get("description"), attrId))
  365. .withName(attrId)
  366. .withMode(firstNotBlank(data.get("mode"), AttributePermissionMode.APM_WRITE.name()))
  367. .withType(firstNonNull(trimToNull(data.get("type")), "string"))
  368. .withShowInGrid(toBooleanOrDefault(data.get("showInGrid"), true))
  369. .withUnique(toBooleanOrDefault(data.get("unique"), false))
  370. .withRequired(toBooleanOrDefault(data.get("required"), false))
  371. //TODO handle all data
  372. .build();
  373. }
  374. private ClassData cliToClassData(String classId, Map<String, String> data) {
  375. return SimpleClassData.builder()
  376. .withActive(toBooleanOrDefault(data.get("active"), true))
  377. .withName(classId)
  378. .withDescription(firstNonNull(trimToNull(data.get("description")), classId))
  379. .withParentId(emptyToNull(data.get("parent")))
  380. .withSuperclass(toBooleanOrDefault(data.get("prototype"), false))
  381. .withType(firstNonNull(trimToNull(data.get("type")), "standard"))
  382. .build();
  383. }
  384. private void printClass(ClassData classeData) {
  385. map("name", classeData.getName(),
  386. "description", classeData.getDescription(),
  387. "type", classeData.getType(),
  388. "parent", classeData.getParentId(),
  389. "superclass", classeData.isSuperclass(),
  390. "active", classeData.isActive()).entrySet().forEach((entry) -> {
  391. System.out.format("%-16s\t%-32s\n", entry.getKey(), entry.getValue());
  392. });
  393. }
  394. @CliCommand
  395. protected void getCard(String classId, String cardId) {
  396. Card card = client.doLoginWithAnyGroup(username, password).card().getCard(classId, cardId);
  397. System.out.println("received card for id: " + card.getCardId());
  398. card.getAttributes().entrySet().forEach((entry) -> {
  399. System.out.format("\t%-32s\t%-32s\n", entry.getKey(), entry.getValue());
  400. });
  401. }
  402. @CliCommand("cards")
  403. protected void getCards(String classeId) {
  404. List<Card> cards = client.doLoginWithAnyGroup(username, password).card().getCards(classeId);
  405. System.out.println("received card values for classe: " + classeId);
  406. cards.forEach((card) -> {
  407. System.out.format("\t%-10s\t%s\n", card.getCardId(), card.getDescription());
  408. });
  409. }
  410. @CliCommand("query")
  411. protected void queryCards(String filter, String sort, String offset, String limit) {
  412. List<Card> cards = client.doLoginWithAnyGroup(username, password).card().queryCards()
  413. .filter(filter)
  414. .sort(sort)
  415. .limit(toIntegerOrNull(limit))
  416. .offset(toIntegerOrNull(offset))
  417. .getCards();
  418. System.out.println("received card values for query");
  419. cards.forEach((card) -> {
  420. System.out.format("\t%-10s\t%s\n", card.getCardId(), card.getDescription());
  421. });
  422. }
  423. @CliCommand
  424. protected void deleteCard(String classId, String cardId) {
  425. client.doLoginWithAnyGroup(username, password).card().deleteCard(classId, cardId);
  426. System.out.println("deleted card for id: " + cardId);
  427. }
  428. @CliCommand
  429. protected void createCard(String classId, Map<String, String> data) {
  430. Card card = client.doLoginWithAnyGroup(username, password).card().createCard(classId, new SimpleCard(data)).getCard();
  431. System.out.println("created card for id: " + card.getCardId());
  432. }
  433. @CliCommand
  434. protected void getAttachments(String classId, String cardId) {
  435. List<Attachment> attachments = client.doLoginWithAnyGroup(username, password).attachment().getCardAttachments(classId, cardId);
  436. attachments.forEach((attachment) -> {
  437. System.out.printf("%-32s\t%-32s\t%-32s\n", attachment.getId(), attachment.getFileName(), attachment.getVersion());
  438. });
  439. }
  440. @CliCommand
  441. protected void getAttachmentHistory(String classId, String cardId, String attachmentId) {
  442. List<Attachment> attachments = client.doLoginWithAnyGroup(username, password).attachment().getAttachmentHistory(classId, cardId, attachmentId);
  443. attachments.forEach((attachment) -> {
  444. System.out.printf("%-32s\t%-32s\n", attachment.getFileName(), attachment.getVersion());
  445. });
  446. }
  447. @CliCommand
  448. protected void createAttachment(String classId, String cardId, String fileName) throws FileNotFoundException {
  449. File file = new File(fileName);
  450. checkArgument(file.isFile(), "file %s is not a valid file", file);
  451. Attachment attachment = client.doLoginWithAnyGroup(username, password).attachment().createCardAttachment(classId, cardId, file.getName(), new FileInputStream(file)).getAttachment();
  452. System.out.printf("created attachment: %s\n", attachment);
  453. }
  454. @CliCommand
  455. protected void updateAttachment(String classId, String cardId, String attachmentId, String fileName) throws FileNotFoundException {
  456. File file = new File(fileName);
  457. checkArgument(file.isFile(), "file %s is not a valid file", file);
  458. Attachment attachment = client.doLoginWithAnyGroup(username, password).attachment().updateCardAttachment(classId, cardId, attachmentId, file.getName(), new FileInputStream(file)).getAttachment();
  459. System.out.printf("updated attachment: %s\n", attachment);
  460. }
  461. @CliCommand
  462. protected void deleteattachment(String classId, String cardId, String attachmentId) {
  463. client.doLoginWithAnyGroup(username, password).attachment().deleteCardAttachment(classId, cardId, attachmentId);
  464. System.out.printf("OK\n");
  465. }
  466. @CliCommand
  467. protected void getAttachment(String classId, String cardId, String attachmentId) throws IOException {
  468. AttachmentData data = client.doLoginWithAnyGroup(username, password).attachment().download(classId, cardId, attachmentId).getData();
  469. IOUtils.write(data.toByteArray(), System.out);
  470. }
  471. @CliCommand
  472. protected void getAttachmentPreview(String classId, String cardId, String attachmentId) throws IOException {
  473. AttachmentPreview data = client.doLoginWithAnyGroup(username, password).attachment().preview(classId, cardId, attachmentId).getPreview();
  474. if (data.hasPreview()) {
  475. IOUtils.write(data.toByteArray(), System.out);
  476. } else {
  477. System.err.println("NO PREVIEW AVAILABLE");
  478. System.exit(1);//TOOD set return value, and do clean shutdown
  479. }
  480. }
  481. @CliCommand
  482. protected void importFromDms() {
  483. client.doLoginWithAnyGroup(username, password).system().importFromDms();
  484. System.out.println("OK");
  485. }
  486. @CliCommand
  487. protected void getProcesses() {
  488. client.doLoginWithAnyGroup(username, password).workflow().getPlans().forEach((plan) -> {
  489. System.out.format("%-32s\t%-32s\n", plan.getId(), plan.getDescription());
  490. });
  491. }
  492. @CliCommand
  493. protected void getProcess(String processId) {
  494. WokflowApi workflow = client.doLoginWithAnyGroup(username, password).workflow();
  495. WokflowApi.PlanInfo plan = workflow.getPlan(processId);
  496. List<WokflowApi.PlanVersionInfo> planVersions = workflow.getPlanVersions(processId);
  497. System.out.printf("plan %s (%s):\n", plan.getId(), plan.getDescription());
  498. planVersions.forEach((version) -> {
  499. System.out.printf("\t%1s %-16s\t%-16s\t%s\n", version.isDefault() ? "*" : "", version.getProvider(), version.getVersion(), version.getPlanId());
  500. });
  501. }
  502. @CliCommand
  503. protected void getProcessTemplate(String processId) {
  504. String xpdlTemplate = client.doLoginWithAnyGroup(username, password).workflow().getXpdlTemplate(processId);
  505. System.out.println(xpdlTemplate);
  506. }
  507. @CliCommand
  508. protected void uploadProcess(String processId, String fileName) throws FileNotFoundException {
  509. File file = new File(fileName);
  510. checkArgument(file.isFile(), "file %s is not a valid file", file);
  511. WokflowApi.PlanVersionInfo planVersionInfo = client.doLoginWithAnyGroup(username, password).workflow().uploadPlanVersion(processId, new FileInputStream(file)).getPlanVersionInfo();
  512. System.out.printf("created plan: %s\n", planVersionInfo);
  513. }
  514. @CliCommand
  515. protected void migrateProcess(String processId, String fileName, String provider) throws FileNotFoundException {
  516. File file = new File(fileName);
  517. checkArgument(file.isFile(), "file %s is not a valid file", file);
  518. client.doLoginWithAnyGroup(username, password).workflow().uploadPlanVersionAndMigrateProcess(processId, new FileInputStream(file), provider);
  519. System.out.printf("migrated process to provider: %s\n", provider);
  520. }
  521. @CliCommand
  522. protected void downloadProcess(String classId, String planId) {
  523. System.out.println(client.doLoginWithAnyGroup(username, password).workflow().downloadPlanVersion(classId, planId));
  524. }
  525. @CliCommand(alias = {"flowgraph", "fg"})
  526. protected void getFlowGraph(String classId, String cardId) throws IOException {
  527. byte[] data = client.doLoginWithAnyGroup(username, password).workflow().downloadFlowGraph(classId, toLong(cardId));
  528. File file = new File(tempDir(), "file.png");
  529. FileUtils.writeByteArrayToFile(file, data);
  530. Desktop.getDesktop().open(file);
  531. }
  532. @CliCommand(alias = {"simplifiedflowgraph", "sfg"})
  533. protected void getSimplifiedFlowGraph(String classId, String cardId) throws IOException {
  534. byte[] data = client.doLoginWithAnyGroup(username, password).workflow().downloadSimplifiedFlowGraph(classId, toLong(cardId));
  535. File file = new File(tempDir(), "file.png");
  536. FileUtils.writeByteArrayToFile(file, data);
  537. Desktop.getDesktop().open(file);
  538. }
  539. @CliCommand
  540. protected void uploadCustomPageFile(String fileName) throws FileNotFoundException {
  541. File file = new File(fileName);
  542. checkArgument(file.isFile(), "file %s is not a valid file", file);
  543. uploadCustomPage(new FileInputStream(file));
  544. }
  545. @CliCommand
  546. protected void uploadCustomPageDir(String dirName) throws FileNotFoundException {
  547. File dir = new File(dirName);
  548. checkArgument(dir.isDirectory(), "dir %s is not a valid directory", dir);
  549. byte[] data = dirToZip(dir);
  550. uploadCustomPage(new ByteArrayInputStream(data));
  551. }
  552. private void uploadCustomPage(InputStream in) {
  553. CustomPageInfo customPageInfo = client.doLoginWithAnyGroup(username, password).customPage().upload(in).getCustomPageInfo();
  554. System.out.printf("uploaded custom page: %s %s (%s)\n", customPageInfo.getId(), customPageInfo.getName(), customPageInfo.getDescription());
  555. }
  556. @CliCommand(alias = {"startprocess"})
  557. protected void startFlow(String processId, Map<String, Object> data) {
  558. FlowDataAndStatus flow = client.doLoginWithAnyGroup(username, password).workflow().start(processId, SimpleFlowData.builder().withAttributes(data).build()).getFlowData();
  559. printFlowActionOutput("started", flow);
  560. }
  561. @CliCommand
  562. protected void completeTask(String processId, String instanceId, String taskId, Map<String, Object> data) {
  563. FlowDataAndStatus flow = client.doLoginWithAnyGroup(username, password).workflow().advance(processId, instanceId, taskId, SimpleFlowData.builder().withAttributes(data).build()).getFlowData();
  564. printFlowActionOutput("advanced", flow);
  565. }
  566. private void printFlowActionOutput(String action, FlowDataAndStatus flow) {
  567. System.out.printf("%s process instance with id: %s\n\tflow status is: %s\n\ttasklist size: %s\n", action, flow.getFlowCardId(), flow.getFlowStatus(), flow.getTaskList().size());
  568. flow.getTaskList().forEach((task) -> {
  569. System.out.println();
  570. printTaskDetail(task);
  571. });
  572. }
  573. @CliCommand(alias = {"getprocessinstance", "flow"})
  574. protected void getFlow(String processId, String instanceId) {
  575. WokflowApi.FlowData walk = client.doLoginWithAnyGroup(username, password).workflow().get(processId, instanceId);
  576. System.out.println("received process instance for id: " + walk.getFlowId());
  577. System.out.printf("status is: %s\n", walk.getStatus());
  578. walk.getAttributes().entrySet().forEach((entry) -> {
  579. System.out.format("\t%-32s\t%-32s\n", entry.getKey(), entry.getValue());
  580. });
  581. }
  582. @CliCommand(alias = {"tasks", "tasklist"})
  583. protected void getTaskList(String processId, String instanceId) {
  584. List<WokflowApi.TaskInfo> list = client.doLoginWithAnyGroup(username, password).workflow().getTaskList(processId, instanceId);
  585. System.out.println("received process instance activities for id: " + instanceId);
  586. list.forEach((activity) -> {
  587. System.out.format("\t%-48s\t%-32s\n", activity.getId(), activity.getDescription());
  588. });
  589. }
  590. @CliCommand(alias = {"task"})
  591. protected void getTask(String processId, String instanceId, String taskId) {
  592. WokflowApi.TaskDetail task = client.doLoginWithAnyGroup(username, password).workflow().getTask(processId, instanceId, taskId);
  593. printTaskDetail(task);
  594. }
  595. @CliCommand(alias = {"getstarttask"})
  596. protected void getStartProcessTask(String processId) {
  597. WokflowApi.TaskDetail task = client.doLoginWithAnyGroup(username, password).workflow().getStartProcessTask(processId);
  598. printTaskDetail(task);
  599. }
  600. private void printTaskDetail(TaskDetail task) {
  601. // System.out.format("received task detail for task %s (%s)\n", taskId, task.getDescription());
  602. System.out.format("task detail for task %s (%s)\n", task.getId(), task.getDescription());
  603. task.getParams().forEach((param) -> {
  604. System.out.format("\t%-32s\trequired = %-5s\twritable = %-5s\taction = %-5s\ttype = %-10s\t%-32s", param.getName(), param.isRequired(), param.isWritable(), param.isAction(), param.getDetail().getType(), param.getDetail().targetInfoToString());
  605. if (param.getDetail().hasFilter()) {
  606. System.out.printf("\tfilter = %s", param.getDetail().getFilter());
  607. }
  608. System.out.println();
  609. });
  610. }
  611. @CliCommand(alias = {"loggers"})
  612. protected void getLoggers() {
  613. List<LoggerInfo> loggers = client.doLoginWithAnyGroup(username, password).system().getLoggers();
  614. loggers.forEach((loggerInfo) -> {
  615. System.out.format("%-32s\t%-32s\n", loggerInfo.getCategory(), loggerInfo.getLevel());
  616. });
  617. }
  618. @CliCommand
  619. protected void setLogger(String loggerCategory, String loggerLevel) {
  620. client.doLoginWithAnyGroup(username, password).system().setLogger(loggerCategory, loggerLevel);
  621. System.out.println("set logger " + loggerCategory + " to level " + loggerLevel);
  622. }
  623. @CliCommand
  624. protected void deleteLogger(String loggerCategory) {
  625. client.doLoginWithAnyGroup(username, password).system().deleteLogger(loggerCategory);
  626. System.out.println("removed logger " + loggerCategory);
  627. }
  628. @CliCommand(alias = {"configs"})
  629. protected void getConfigs() {
  630. Map<String, String> config = client.doLoginWithAnyGroup(username, password).system().getConfig();
  631. config.entrySet().forEach((entry) -> {
  632. System.out.format("%-70s\t%s\n", abbreviate(entry.getKey(), 70), abbreviate(entry.getValue(), 100));
  633. });
  634. }
  635. @CliCommand(alias = {"config"})
  636. protected void getConfig(String key) {
  637. String value = client.doLoginWithAnyGroup(username, password).system().getConfig(key);
  638. System.out.println(value);
  639. }
  640. @CliCommand(alias = {"configinfo", "configdefinition", "configdesc", "configinfos", "configdefinitions", "configdescs", "getconfiginfos", "getconfigdefinitions", "getconfigdescs", "configsinfo", "configsdefinition", "configsdesc"})
  641. protected void getConfigDesc() {
  642. Map<String, ConfigDefinition> configDefinitions = client.doLoginWithAnyGroup(username, password).system().getConfigDefinitions();
  643. configDefinitions.entrySet().forEach((entry) -> {
  644. System.out.format("%-70s\t%-30s\t%s\n", abbreviate(entry.getKey(), 70), abbreviate(entry.getValue().getDefaultValue(), 30), abbreviate(entry.getValue().getDescription(), 100));
  645. });
  646. }
  647. @CliCommand(alias = {"exportconfig", "exportconfigs"})
  648. protected void getConfigProperties() throws IOException {
  649. Map<String, String> config = filterConfigs(client.doLoginWithAnyGroup(username, password).system().getConfig());
  650. Properties properties = new Properties();
  651. properties.putAll(Maps.filterEntries(config, (entry) -> entry.getValue() != null));
  652. properties.store(System.out, null);
  653. }
  654. @CliCommand(alias = {"importconfig", "importconfigs"})
  655. protected void setConfigProperties(String propertyFile) throws IOException {
  656. Properties properties = new Properties();
  657. properties.load(new FileInputStream(propertyFile));
  658. System.out.printf("import config from file = %s :\n", propertyFile);
  659. properties.forEach((key, value) -> {
  660. System.out.printf("\tset config %s = %s\n", key, value);
  661. });
  662. client.doLoginWithAnyGroup(username, password).system().setConfigs(map(properties));
  663. }
  664. @CliCommand
  665. protected void setConfig(String key, String value) {
  666. client.doLoginWithAnyGroup(username, password).system().setConfig(key, value);
  667. System.out.println("set config " + key + " = " + value);
  668. }
  669. @CliCommand
  670. protected void deleteConfig(String key) {
  671. client.doLoginWithAnyGroup(username, password).system().deleteConfig(key);
  672. System.out.printf("delete config = %s\n", key);
  673. }
  674. @CliCommand(alias = {"reloadconfig"})
  675. protected void reloadConfig() {
  676. client.doLoginWithAnyGroup(username, password).system().reloadConfig();
  677. System.out.println("OK");
  678. }
  679. private static Map<String, String> filterConfigs(Map<String, String> configs) {//TODO refactor this...handle kkepconfigfile server side (?)
  680. return filterKeys(configs, (k) -> !k.endsWith("keepconfigfile"));
  681. }
  682. @CliCommand
  683. protected void editConfig() throws IOException {//TODO merge code with getConfigProperties()
  684. SystemApi system = client.doLoginWithAnyGroup(username, password).system();
  685. Map<String, String> config = filterConfigs(system.getConfig());
  686. Map<String, ConfigDefinition> defs = system.getConfigDefinitions();
  687. StringBuilder editableConfig = new StringBuilder();
  688. String[] curPrefix = {""};
  689. defs.keySet().stream().sorted().forEach((key) -> {
  690. ConfigDefinition def = defs.get(key);
  691. String prefix = key.replaceFirst("org.cmdbuild.([^.]+).*", "$1");
  692. if (!equal(prefix, curPrefix[0])) {
  693. editableConfig.append(format("\n# === %s ===\n\n", prefix.toUpperCase()));
  694. curPrefix[0] = prefix;
  695. }
  696. if (def.hasDescription()) {
  697. editableConfig.append("#\n# ").append(def.getDescription()).append(":\n");
  698. }
  699. if (config.containsKey(key)) {
  700. editableConfig.append(format("%s=%s", key, config.get(key))).append("\n");
  701. } else {
  702. editableConfig.append(format("#%s=%s", key, nullToEmpty(def.getDefaultValue()))).append("\n");
  703. }
  704. if (def.hasDescription()) {
  705. editableConfig.append("#\n");
  706. }
  707. });
  708. editableConfig.append(format("\n# === %s ===\n\n", "OTHER"));
  709. config.keySet().stream().filter(not(defs::containsKey)).sorted().forEach((key) -> {
  710. editableConfig.append(format("%s=%s", key, config.get(key))).append("\n");
  711. });
  712. editableConfig.append("\n\n");
  713. String editedConfig = editFile(editableConfig.toString(), "config", "properties");
  714. Properties properties = new Properties();
  715. properties.load(new StringReader(editedConfig));
  716. Map<String, String> toSet = map();
  717. properties.forEach((key, value) -> {
  718. if (!equal(value, config.get((String) key))) {
  719. System.out.printf("set config %s = %s\n", key, value);
  720. toSet.put((String) key, (String) value);
  721. }
  722. });
  723. if (!toSet.isEmpty()) {
  724. system.setConfigs(toSet);
  725. }
  726. config.keySet().stream().filter((k) -> !k.endsWith("keepconfigfile")).filter(not(properties::containsKey)).forEach((key) -> {//TODO handle kkepconfigfile server side (?)
  727. System.out.printf("delete config = %s\n", key);
  728. system.deleteConfig(key);
  729. });
  730. }
  731. @CliCommand
  732. protected void mark() {
  733. String mark = client.doLoginWithAnyGroup(username, password).audit().mark();
  734. CliSessionVariables.getInstance().get().put("restws.mark", mark);
  735. System.out.printf("audit mark: %s\n", mark);
  736. }
  737. @CliCommand(alias = {"lastrequests", "glr"})
  738. protected void getLastRequests() {
  739. getLastRequests(25);
  740. }
  741. @CliCommand(alias = {"lastrequests", "glr"})
  742. protected void getLastRequests(int limit) {
  743. List<RequestInfo> requests = client.doLoginWithAnyGroup(username, password).audit().getLastRequests(limit);
  744. printRequests(requests);
  745. }
  746. @CliCommand(alias = {"requests", "gr"})
  747. protected void getRequests() {
  748. String mark = trimToNull(CliSessionVariables.getInstance().get().get("restws.mark"));
  749. checkArgument(mark != null, "missing mark");
  750. List<RequestInfo> requests = client.doLoginWithAnyGroup(username, password).audit().getRequestsSince(mark);
  751. printRequests(requests);
  752. }
  753. @CliCommand(alias = {"lasterrors", "gle"})
  754. protected void getLastErrors() {
  755. getLastErrors(25);
  756. }
  757. @CliCommand(alias = {"lasterrors", "gle"})
  758. protected void getLastErrors(int limit) {
  759. List<RequestInfo> requests = client.doLoginWithAnyGroup(username, password).audit().getLastErrors(limit);
  760. printRequests(requests);
  761. }
  762. //
  763. // @CliCommand("e")
  764. // protected void getErrors() {
  765. // String mark = trimToNull(CliSessionVariables.getInstance().get().get("restws.mark"));
  766. // checkArgument(mark != null, "missing mark");
  767. // List<RequestInfo> requests = client.doLoginWithAnyGroup(username, password).audit().getRequestsSince(mark);
  768. // printRequests(requests);
  769. // }
  770. private void printRequests(List<RequestInfo> requests) {
  771. System.out.printf("timestamp (%6s) requestId actionId sessionId user elap method response path query \n", getReadableTimezoneOffset());
  772. requests.stream().filter((request) -> !request.getActionId().matches("cli_restws_(get)?requests|cli_restws_mark")).forEach((request) -> {
  773. System.out.printf("%-18s %-24s %-32s %-24s %-16s %6s %-6s %9s %-50s %s %s\n",
  774. toUserReadableDateTime(request.getTimestamp()),
  775. abbreviate(request.getRequestId(), 24),
  776. abbreviate(request.getActionId(), 32),
  777. nullToEmpty(request.getSessionId()),
  778. nullToEmpty(request.getUser()),
  779. request.isCompleted() ? (request.getElapsedTimeMillis() + "ms") : "",
  780. request.getMethod(),
  781. responseCode(request),
  782. request.getPath(),
  783. request.getQuery(),
  784. request.isSoap() ? nullToEmpty(request.getSoapActionOrMethod()) : "");
  785. });
  786. }
  787. @CliCommand(alias = {"request", "gr"})
  788. protected void getRequest(String requestId) {
  789. RequestData requestData = client.doLoginWithAnyGroup(username, password).audit().getRequestData(requestId.replaceAll("[.]", ""));
  790. String payload = prettifyIfJson(prettifyIfXml(nullToEmpty(requestData.getPayload())));
  791. String response = prettifyIfJson(prettifyIfXml(nullToEmpty(requestData.getResponse())));
  792. System.out.printf("actionId : %s\n", requestData.getActionId());
  793. System.out.printf("requestId : %s\n", requestData.getRequestId());
  794. System.out.printf("trackingId : %s\n", requestData.getTrackingId());
  795. System.out.printf("sessionId : %s (%s)\n\n", requestData.getSessionId(), requestData.getUser());
  796. System.out.printf("client : %s (%s)\n\n", requestData.getClient(), requestData.getUserAgent());
  797. System.out.printf("request : %s %s %s\n", requestData.getMethod(), requestData.getPath(), nullToEmpty(requestData.getQuery()));
  798. System.out.printf("response : %s\n\n", responseCode(requestData));
  799. if (isNotBlank(requestData.getQuery())) {
  800. Splitter.on("&").omitEmptyStrings().splitToList(requestData.getQuery()).stream().forEach((v) -> {
  801. try {
  802. List<String> split = Splitter.on("=").splitToList(v);
  803. String key = split.get(0), value = split.get(1);
  804. value = URLDecoder.decode(value);
  805. System.out.printf("query param: %10s = %s\n", key, value);
  806. } catch (Exception ex) {
  807. System.out.printf("query param: %s\n", v);
  808. }
  809. });
  810. System.out.println();
  811. }
  812. System.out.printf("=== payload (%s bytes) ===\n%s\n", requestData.getPayloadSize(), payload);
  813. System.out.printf("=== response (%s bytes) ===\n%s\n=== end ===\n", requestData.getResponseSize(), response);
  814. if (!requestData.getErrorOrWarningEvents().isEmpty()) {
  815. System.out.printf("\n\n=== errors and messages ===\n\n");
  816. requestData.getErrorOrWarningEvents().forEach((e) -> {
  817. System.out.printf("level : %s\n", e.getLevel());
  818. System.out.printf("message : %s\n\n", e.getMessage());
  819. System.out.printf("stacktrace : %s\n", e.getStackTrace());
  820. });
  821. System.out.printf("=== end ===\n");
  822. }
  823. String requestUrl = requestData.getPath().replaceFirst("^/", "");
  824. if (isNotBlank(requestData.getQuery())) {
  825. requestUrl += "?" + requestData.getQuery();
  826. }
  827. String payloadForCurl;
  828. if (requestData.isBinary()) {
  829. File tempFile = new File(sysTmpDir(), format("%s.file", randomId(6)));
  830. writeToFile(tempFile, requestData.getBinaryPayload());
  831. payloadForCurl = format("@%s", tempFile.getAbsolutePath());
  832. } else {
  833. payloadForCurl = requestData.getPayload();
  834. }
  835. String cli = buildCurlCli(client.getSessionToken(), requestUrl, requestData.getMethod(), payloadForCurl);
  836. System.out.println("\n" + cli);
  837. }
  838. private String responseCode(RequestInfo request) {
  839. return format("%s%s", request.hasError() ? "ERROR " : "", request.getStatusCode()).trim();
  840. }
  841. @CliCommand("patches")
  842. protected void getPatches() {
  843. client.system().getPatches().forEach((patch) -> {
  844. System.out.printf("%-24s %-24s %s\n", patch.getCategory(), patch.getName(), nullToEmpty(patch.getDescription()));
  845. });
  846. }
  847. @CliCommand
  848. protected void applyPatches() {
  849. client.system().applyPatches();
  850. System.out.println("OK");
  851. }
  852. @CliCommand
  853. protected void dropAllCaches() {
  854. client.doLoginWithAnyGroup(username, password).system().dropAllCaches();
  855. System.out.println("OK");
  856. }
  857. @CliCommand
  858. protected void dropCache(String cacheId) {
  859. client.doLoginWithAnyGroup(username, password).system().dropCache(cacheId);
  860. System.out.println("OK");
  861. }
  862. @CliCommand
  863. protected void upload(String path, String fileName) throws FileNotFoundException, IOException {
  864. File file = new File(fileName);
  865. checkArgument(file.isFile(), "file %s is not a valid file", file);
  866. client.doLoginWithAnyGroup(username, password).uploads().upload(path, toByteArray(file));
  867. // System.out.printf("created plan: %s\n", planVersionInfo); TODO return info on created file
  868. }
  869. @CliCommand
  870. protected void download(String path) throws IOException {
  871. byte[] data = client.doLoginWithAnyGroup(username, password).uploads().download(path).toByteArray();
  872. IOUtils.write(data, System.out);
  873. }
  874. @CliCommand
  875. protected void printReport(String reportId, String ext, Map<String, String> params) throws IOException {
  876. byte[] data = client.doLoginWithAnyGroup(username, password).report().executeAndDownload(reportId, ReportExtension.valueOf(ext.toUpperCase()), (Map) params).toByteArray();
  877. IOUtils.write(data, System.out);
  878. }
  879. @CliCommand
  880. protected void downloadReport(String reportId) throws IOException {
  881. printReport(reportId, "zip", emptyMap());
  882. }
  883. @CliCommand
  884. protected void createReport(String code, String reportTemplateDir) throws IOException {
  885. checkArgument(new File(reportTemplateDir).isDirectory(), "file %s is not a directory", reportTemplateDir);
  886. List<File> files = list(new File(reportTemplateDir).listFiles());
  887. System.out.printf("create report = %s files = %s\n", code, files.stream().map(File::getName).collect(joining(",")));
  888. ReportInfo info = ReportInfoImpl.builder()
  889. .withActive(true)
  890. .withCode(code)
  891. .withDescription(code)
  892. .build();
  893. ReportInfo reportInfo = client.doLoginWithAnyGroup(username, password).report().createReport(info, files);
  894. System.out.printf("created report = %s %s\n", reportInfo.getId(), reportInfo.getCode());
  895. }
  896. @CliCommand
  897. protected void uploadReport(String reportId, String reportTemplateDir) throws IOException {
  898. List<File> files = list(new File(reportTemplateDir).listFiles());
  899. System.out.printf("upload report template for report = %s files = %s\n", reportId, files.stream().map(File::getName).collect(joining(",")));
  900. client.doLoginWithAnyGroup(username, password).report().uploadReportTemplate(toLong(reportId), files);
  901. }
  902. @CliCommand("upgrade")
  903. protected void upgradeWebapp(String fileName) throws FileNotFoundException, IOException {
  904. File file = new File(fileName);
  905. checkArgument(file.isFile(), "file %s is not a valid file", file);
  906. System.out.printf("upgrade cmdbuild webapp, load war file = %s\n", file.getAbsolutePath());
  907. client.doLoginWithAnyGroup(username, password).withUploadProgressListener((e) -> {
  908. System.out.printf("\t upload progress: %s\n", e.getProgressDescriptionLong());
  909. }).system().upgradeWebapp(new FileInputStream(file));
  910. System.out.println("execute upgrade");// TODO wait for restart, notify completion
  911. }
  912. @CliCommand("upgrade")
  913. protected void upgradeWebapp() throws FileNotFoundException, IOException {
  914. checkArgument(isRunningFromWarFile(), "must specify war file");
  915. upgradeWebapp(getWarFile().getAbsolutePath());
  916. }
  917. private String buildCurlCli(String authToken, String service) {
  918. return buildCurlCli(authToken, service, "get", null);
  919. }
  920. private String buildCurlCli(String authToken, String service, String method, @Nullable String payload) {
  921. String methodParam, otherParams = "";
  922. switch (method.toUpperCase()) {
  923. case "GET":
  924. methodParam = "";
  925. break;
  926. default:
  927. methodParam = format("-X %s", method.toUpperCase());
  928. if (payload != null) {
  929. otherParams += format(" --data-binary '%s'", payload);
  930. if (payload.startsWith("{")) {//json; TODO: improve this
  931. otherParams += " -H'Content-Type:application/json'";
  932. }
  933. }
  934. }
  935. return format("cmdbuild_auth_token='%s'\ncurl %s -vv -H\"Cmdbuild-authorization:${cmdbuild_auth_token}\" \"%s\" %s | jshon\n",
  936. authToken, methodParam, baseUrl + service, otherParams);
  937. }
  938. }