1 package org.argeo.connect.resources.core;
2
3 import java.io.IOException;
4 import java.io.InputStream;
5 import java.net.URL;
6 import java.util.ArrayList;
7 import java.util.EnumSet;
8 import java.util.List;
9
10 import javax.jcr.Node;
11 import javax.jcr.RepositoryException;
12 import javax.jcr.Session;
13 import javax.jcr.nodetype.NodeType;
14 import javax.jcr.security.Privilege;
15
16 import org.argeo.connect.ConnectConstants;
17 import org.argeo.connect.ConnectException;
18 import org.argeo.connect.ConnectTypes;
19 import org.argeo.connect.core.AbstractMaintenanceService;
20 import org.argeo.connect.resources.ResourcesNames;
21 import org.argeo.connect.resources.ResourcesRole;
22 import org.argeo.connect.resources.ResourcesService;
23 import org.argeo.connect.resources.ResourcesTypes;
24 import org.argeo.connect.util.ConnectJcrUtils;
25 import org.argeo.jcr.JcrUtils;
26 import org.argeo.people.core.imports.EncodedTagCsvFileParser;
27
28
29 public class ResourcesMaintenanceService extends AbstractMaintenanceService {
30 private ResourcesService resourcesService;
31
32 @Override
33 public List<String> getRequiredRoles() {
34 return enumToDns(EnumSet.allOf(ResourcesRole.class));
35 }
36
37 @Override
38 protected void addOfficeGroups() {
39 addManagersToGroup(ResourcesRole.editor.dn());
40 addCoworkersToGroup(ResourcesRole.reader.dn());
41 }
42
43 @Override
44 public boolean prepareJcrTree(Session session) {
45 try {
46 boolean hasChanged = false;
47 Node resourcesParent = JcrUtils.mkdirs(session, getDefaultBasePath());
48 JcrUtils.mkdirs(resourcesParent, ResourcesNames.RESOURCES_TAG_LIKE);
49 JcrUtils.mkdirs(resourcesParent, ResourcesNames.RESOURCES_TEMPLATES);
50 addModelResources(session);
51 if (session.hasPendingChanges()) {
52 session.save();
53 hasChanged = true;
54 }
55 return hasChanged;
56 } catch (RepositoryException | IOException e) {
57 JcrUtils.discardQuietly(session);
58 throw new ConnectException("Cannot create base nodes for Resources app", e);
59 }
60 }
61
62
63 protected void addModelResources(Session adminSession) throws IOException {
64
65 if (resourcesService.getTagLikeResourceParent(adminSession, ConnectConstants.RESOURCE_COUNTRY) == null) {
66 String path = "/" + getClass().getPackage().getName().replace('.', '/') + "/ISO3166-1-countries.csv";
67 URL url = getClass().getResource(path);
68 try (InputStream in = url.openStream()) {
69 resourcesService.createTagLikeResourceParent(adminSession, ConnectConstants.RESOURCE_COUNTRY,
70 ResourcesTypes.RESOURCES_ENCODED_TAG, ResourcesNames.RESOURCES_TAG_CODE, "/",
71 ConnectJcrUtils.getLocalJcrItemName(NodeType.NT_UNSTRUCTURED), new ArrayList<String>());
72 String EN_SHORT_NAME = "English short name (upper-lower case)";
73 String ISO_CODE = "Alpha-2 code";
74 new EncodedTagCsvFileParser(resourcesService, adminSession, ConnectConstants.RESOURCE_COUNTRY, ISO_CODE,
75 EN_SHORT_NAME).parse(in, "UTF-8");
76 }
77 }
78
79 if (resourcesService.getTagLikeResourceParent(adminSession, ConnectConstants.RESOURCE_LANG) == null) {
80 String path = "/" + getClass().getPackage().getName().replace('.', '/') + "/ISO639-1-languages.csv";
81 URL url = getClass().getResource(path);
82 try (InputStream in = url.openStream()) {
83 resourcesService.createTagLikeResourceParent(adminSession, ConnectConstants.RESOURCE_LANG,
84 ResourcesTypes.RESOURCES_ENCODED_TAG, ResourcesNames.RESOURCES_TAG_CODE, "/",
85 ConnectJcrUtils.getLocalJcrItemName(NodeType.NT_UNSTRUCTURED), new ArrayList<String>());
86 String EN_SHORT_NAME = "Language name";
87 String ISO_CODE = "639-1";
88 new EncodedTagCsvFileParser(resourcesService, adminSession, ConnectConstants.RESOURCE_LANG, ISO_CODE,
89 EN_SHORT_NAME).parse(in, "UTF-8");
90 }
91 }
92
93
94 if (resourcesService.getTagLikeResourceParent(adminSession, ConnectConstants.RESOURCE_TAG) == null)
95 resourcesService.createTagLikeResourceParent(adminSession, ConnectConstants.RESOURCE_TAG,
96 ResourcesTypes.RESOURCES_TAG, null, "/", ConnectTypes.CONNECT_TAGGABLE,
97 ResourcesNames.CONNECT_TAGS);
98
99
100
101
102
103
104
105 }
106
107 @Override
108 public void configurePrivileges(Session session) {
109 try {
110 JcrUtils.addPrivilege(session, getDefaultBasePath(), ResourcesRole.editor.dn(), Privilege.JCR_ALL);
111 JcrUtils.addPrivilege(session, getDefaultBasePath(), ResourcesRole.reader.dn(), Privilege.JCR_READ);
112 session.save();
113 } catch (RepositoryException e) {
114 JcrUtils.discardQuietly(session);
115 throw new ConnectException("Cannot configure JCR privileges for Resources app", e);
116 }
117 }
118
119 public String getDefaultBasePath() {
120 return "/" + ResourcesNames.RESOURCES_BASE_NAME;
121 }
122
123 public void setResourcesService(ResourcesService resourcesService) {
124 this.resourcesService = resourcesService;
125 }
126
127 }