View Javadoc
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  /** Default implementation of an AppMaintenanceService for the Resources app */
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  	// Import resources
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  		// Create tag & mailing list parents
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  		// if (resourcesService.getTagLikeResourceParent(adminSession,
99  		// PeopleTypes.PEOPLE_MAILING_LIST) == null)
100 		// resourcesService.createTagLikeResourceParent(adminSession, null,
101 		// PeopleTypes.PEOPLE_MAILING_LIST, null,
102 		// "/" + peopleService.getBaseRelPath(PeopleTypes.PEOPLE_ENTITY),
103 		// ConnectTypes.CONNECT_ENTITY,
104 		// PeopleNames.PEOPLE_MAILING_LISTS);
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 }