use of org.collectionspace.chain.csp.schema.FieldSet in project application by collectionspace.
the class ConfiguredVocabStorage method autocreateJSON.
@Override
public String autocreateJSON(ContextualisedStorage root, CSPRequestCredentials creds, CSPRequestCache cache, String filePath, JSONObject jsonObject, JSONObject restrictions) throws ExistException, UnimplementedException, UnderlyingStorageException {
try {
Map<String, Document> body = new HashMap<String, Document>();
String vocab = null;
String pathurl = "/" + r.getServicesURL() + "/";
if (filePath.equals("")) {
for (String section : r.getServicesInstancesPaths()) {
String path = r.getServicesInstancesPath(section);
String[] record_path = path.split(":", 2);
String[] tag_path = record_path[1].split(",", 2);
Document temp = createEntry(section, tag_path[0], tag_path[1], jsonObject, vocab, null, r, true);
if (temp != null) {
body.put(record_path[0], temp);
// log.info(temp.asXML());
}
}
} else {
vocab = RefName.shortIdToPath(filePath);
pathurl = "/" + r.getServicesURL() + "/" + vocab + ITEMS_SUFFIX;
for (String section : r.getServicesRecordPathKeys()) {
String path = r.getServicesRecordPath(section);
String[] record_path = path.split(":", 2);
String[] tag_path = record_path[1].split(",", 2);
Document temp = createEntry(section, tag_path[0], tag_path[1], jsonObject, vocab, null, r, false);
if (temp != null) {
body.put(record_path[0], temp);
// log.info(temp.asXML());
}
}
}
handleHierarchyPayloadSend(r, body, jsonObject, null);
ReturnedURL out = conn.getMultipartURL(RequestMethod.POST, pathurl, body, creds, cache);
if (out.getStatus() > 299)
throw new UnderlyingStorageException("Could not create vocabulary", out.getStatus(), pathurl);
String csid = out.getURLTail();
// create related sub records?
for (FieldSet fs : r.getAllSubRecords("POST")) {
Record sr = fs.usesRecordId();
// sr.getID()
if (sr.isType("authority")) {
String savePath = out.getURL() + "/" + sr.getServicesURL();
if (fs instanceof Field) {
// get the fields form inline XXX untested - might not work...
JSONObject subdata = new JSONObject();
// loop thr jsonObject and find the fields I need
for (FieldSet subfs : sr.getAllFieldTopLevel("POST")) {
String key = subfs.getID();
if (jsonObject.has(key)) {
subdata.put(key, jsonObject.get(key));
}
}
subautocreateJSON(root, creds, cache, sr, subdata, savePath);
} else if (fs instanceof Group) {
// JSONObject
if (jsonObject.has(fs.getID())) {
Object subdata = jsonObject.get(fs.getID());
if (subdata instanceof JSONObject) {
JSONObject subrecord = (JSONObject) subdata;
subautocreateJSON(root, creds, cache, sr, subrecord, savePath);
} else {
log.warn("autocreateJSON: Contact subrecord is malformed (not a JSONObject)!");
if (log.isDebugEnabled()) {
log.debug("autocreateJSON: Contact subrecord: " + subdata.toString());
}
}
}
} else {
// JSONArray
if (jsonObject.has(fs.getID())) {
Object subdata = jsonObject.get(fs.getID());
if (subdata instanceof JSONArray) {
JSONArray subarray = (JSONArray) subdata;
for (int i = 0; i < subarray.length(); i++) {
JSONObject subrecord = subarray.getJSONObject(i);
subautocreateJSON(root, creds, cache, sr, subrecord, savePath);
}
}
}
}
}
}
return csid;
} catch (ConnectionException e) {
throw new UnderlyingStorageException("Connection exception" + e.getLocalizedMessage(), e.getStatus(), e.getUrl(), e);
} catch (JSONException e) {
throw new UnderlyingStorageException("Cannot parse surrounding JSON" + e.getLocalizedMessage(), e);
}
}
use of org.collectionspace.chain.csp.schema.FieldSet in project application by collectionspace.
the class VocabRedirector method pathForAll.
/**
* Returns information on the vocabularies (Authority namespaces) that are configured
* for autocomplete use for the passed field, in the context record.
* If the record is itself an Authority term editor, hierarchy fields should
* be constrained to the vocabulary named by vocabConstraint
* @param fieldname The name of the field for which to return the info
* @param vocabConstraint The vocabulary when the field is hierarchic and the record is a term.
* @return Information on the configured vocabularies
* @throws JSONException
*/
private JSONArray pathForAll(String fieldname, String vocabConstraint) throws JSONException {
JSONArray out = new JSONArray();
FieldSet fd = r.getFieldFullList(fieldname);
Instance[] allInstances = null;
if (fd == null || !(fd instanceof Field)) {
if (r.hasHierarchyUsed("screen")) {
// Configures the hierarchy section.
Structure s = r.getStructure("screen");
if (s.hasOption(fieldname)) {
// This is one of the hierarchy fields
if (vocabConstraint != null) {
allInstances = new Instance[1];
String fullname = r.getID() + "-" + vocabConstraint;
allInstances[0] = r.getSpec().getInstance(fullname);
} else {
Option a = s.getOption(fieldname);
String[] data = a.getName().split(",");
allInstances = new Instance[data.length];
for (int i = 0; i < data.length; i++) {
allInstances[i] = (r.getSpec().getInstance(data[i]));
}
}
} else {
FieldSet fs = r.getSpec().getRecord("hierarchy").getFieldFullList(fieldname);
if (fs instanceof Field) {
allInstances = ((Field) fs).getAllAutocompleteInstances();
}
}
}
} else {
allInstances = ((Field) fd).getAllAutocompleteInstances();
}
for (Instance autoc : allInstances) {
if (autoc != null) {
JSONObject instance = new JSONObject();
instance.put("url", "/vocabularies/" + autoc.getWebURL());
instance.put("type", autoc.getID());
instance.put("fullName", autoc.getTitle());
out.put(instance);
} else {
log.debug(String.format("A vocab/authority instance for autocompleting the '%s' field was null or missing.", fieldname));
}
}
return out;
}
use of org.collectionspace.chain.csp.schema.FieldSet in project application by collectionspace.
the class WebTermList method termlist.
private void termlist(CSPRequestCache cache, Storage storage, UIRequest request, String path) throws UIException {
try {
// {tenant}/{tenantname}/{recordType}/termList/{termListType}
// needs to be {tenant}/{tenantname}/{recordType}/termList/{fieldname}
// as blanks etc are on a field basis not a vocab basis
String[] bits = path.split("/");
Record vb = this.spec.getRecord("vocab");
Field f = (Field) r.getFieldTopLevel(bits[0]);
if (f == null) {
f = (Field) r.getFieldFullList(bits[0]);
}
// If the field isn't in this record, look for it in subrecords (e.g. contacts).
if (f == null) {
FieldSet[] subRecordFields = r.getAllSubRecords("GET");
for (int i = 0; i < subRecordFields.length; i++) {
FieldSet subRecordField = subRecordFields[i];
Group group = (Group) subRecordField;
if (group.usesRecord()) {
Record subRecord = group.usesRecordId();
f = (Field) subRecord.getFieldTopLevel(bits[0]);
if (f == null) {
f = (Field) subRecord.getFieldFullList(bits[0]);
}
if (f != null) {
break;
}
}
}
}
JSONArray result = new JSONArray();
if (f.getAllAutocompleteInstances() != null && f.getAllAutocompleteInstances()[0] != null) {
for (Instance ins : f.getAllAutocompleteInstances()) {
JSONArray getallnames = ctl.get(storage, ins.getTitleRef(), vb);
for (int i = 0; i < getallnames.length(); i++) {
result.put(getallnames.get(i));
}
}
} else {
String msg = String.format("Dynamic term list(s) (aka, \"autocomplete\" list) for the field '%s' of record '%s' does not exist. Check that it is defined in the Application layer configuration.", f.toString(), r.whoamI);
log.error(msg);
}
JSONObject out = generateENUMField(storage, f, result, false);
request.sendJSONResponse(out);
int cacheMaxAgeSeconds = spec.getAdminData().getTermListCacheAge();
if (cacheMaxAgeSeconds > 0) {
request.setCacheMaxAgeSeconds(cacheMaxAgeSeconds);
}
} catch (JSONException e) {
throw new UIException("JSONException during autocompletion", e);
}
}
use of org.collectionspace.chain.csp.schema.FieldSet in project application by collectionspace.
the class GenericStorage method refViewRetrieveJSON.
/**
* get data needed for terms Used block of a record
* @param creds
* @param cache
* @param path
* @return
* @throws ExistException
* @throws UnimplementedException
* @throws UnderlyingStorageException
* @throws JSONException
* @throws UnsupportedEncodingException
*/
public JSONObject refViewRetrieveJSON(ContextualisedStorage storage, CSPRequestCredentials creds, CSPRequestCache cache, String path, JSONObject restrictions) throws ExistException, UnimplementedException, UnderlyingStorageException, JSONException, UnsupportedEncodingException {
try {
JSONObject out = new JSONObject();
JSONObject pagination = new JSONObject();
JSONObject listitems = new JSONObject();
// not all the records need a reference, look in cspace-config.xml for which that don't
if (r.hasTermsUsed()) {
path = getRestrictedPath(path, restrictions, "kw", "", false, "");
if (r.hasSoftDeleteMethod()) {
// XXX completely not the right thinsg to do but a good enough hack
path = softpath(path);
}
if (r.hasHierarchyUsed("screen")) {
path = hierarchicalpath(path);
}
ReturnedDocument all = conn.getXMLDocument(RequestMethod.GET, path, null, creds, cache);
if (all.getStatus() != 200)
throw new ConnectionException("Bad request during identifier cache map update: status not 200", all.getStatus(), path);
Document list = all.getDocument();
// assumes consistency in service layer payloads - possible could configure this rather than hard code?
List<Node> nodes = list.selectNodes("authority-ref-list/*");
for (Node node : nodes) {
if (node.getName().equals("authority-ref-item")) {
if (!(node instanceof Element))
continue;
if (((Element) node).hasContent()) {
String key = ((Element) node).selectSingleNode("sourceField").getText();
String refname = ((Element) node).selectSingleNode("refName").getText();
String itemDisplayName = ((Element) node).selectSingleNode("itemDisplayName").getText();
String uri = "";
if (null != ((Element) node).selectSingleNode("uri")) {
// seems to be missing sometimes
uri = ((Element) node).selectSingleNode("uri").getText();
}
String fieldName = key;
if (key.split(":").length > 1) {
fieldName = key.split(":")[1];
}
Field fieldinstance = null;
if (r.getFieldFullList(fieldName) instanceof Repeat) {
Repeat rp = (Repeat) r.getFieldFullList(fieldName);
for (FieldSet a : rp.getChildren("GET")) {
if (a instanceof Field && a.hasAutocompleteInstance()) {
fieldinstance = (Field) a;
}
}
} else {
fieldinstance = (Field) r.getFieldFullList(fieldName);
}
if (fieldinstance != null) {
JSONObject data = new JSONObject();
data.put("sourceField", key);
data.put("itemDisplayName", itemDisplayName);
data.put("refname", refname);
data.put("uri", uri);
// JSONObject data=miniForURI(storage,creds,cache,refname,null,restrictions);
/*
if(!data.has("refid")){//incase of permissions errors try our best
data.put("refid",refname);
if(data.has("displayName")){
String itemDisplayName=((Element)node).selectSingleNode("itemDisplayName").getText();
String temp = data.getString("displayName");
data.remove("displayName");
data.put(temp, itemDisplayName);
}
}
*/
data.put("sourceFieldselector", fieldinstance.getSelector());
data.put("sourceFieldName", fieldName);
data.put("sourceFieldType", r.getID());
if (listitems.has(key)) {
JSONArray temp = listitems.getJSONArray(key).put(data);
listitems.put(key, temp);
} else {
JSONArray temp = new JSONArray();
temp.put(data);
listitems.put(key, temp);
}
}
}
} else {
pagination.put(node.getName(), node.getText());
}
}
}
out.put("pagination", pagination);
out.put("listItems", listitems);
return out;
} catch (ConnectionException e) {
throw new UnderlyingStorageException("Connection problem" + e.getLocalizedMessage(), e.getStatus(), e.getUrl(), e);
}
}
use of org.collectionspace.chain.csp.schema.FieldSet in project application by collectionspace.
the class GenericStorage method updateJSON.
/**
* update the item
* @param root
* @param creds
* @param cache
* @param filePath
* @param jsonObject
* @param thisr
* @param serviceurl
* @throws ExistException
* @throws UnimplementedException
* @throws UnderlyingStorageException
*/
public void updateJSON(ContextualisedStorage root, CSPRequestCredentials creds, CSPRequestCache cache, String filePath, JSONObject jsonObject, JSONObject restrictions, Record thisr, String serviceurl) throws ExistException, UnimplementedException, UnderlyingStorageException {
try {
Map<String, Document> parts = new HashMap<String, Document>();
Document doc = null;
for (String section : thisr.getServicesRecordPathKeys()) {
String path = thisr.getServicesRecordPath(section);
String[] record_path = path.split(":", 2);
doc = XmlJsonConversion.convertToXml(thisr, jsonObject, section, "PUT");
if (doc != null) {
parts.put(record_path[0], doc);
// log.info(doc.asXML());
}
}
// This checks for hierarchy support, and does nothing if not appropriate.
handleHierarchyPayloadSend(thisr, parts, jsonObject, filePath);
int status = 0;
if (thisr.isMultipart()) {
String restrictedPath = getRestrictedPath(serviceurl, filePath, restrictions, null);
ReturnedMultipartDocument docm = conn.getMultipartXMLDocument(RequestMethod.PUT, restrictedPath, parts, creds, cache);
status = docm.getStatus();
} else {
ReturnedDocument docm = conn.getXMLDocument(RequestMethod.PUT, serviceurl + filePath, doc, creds, cache);
status = docm.getStatus();
}
// XXX Completely untested subrecord update
for (FieldSet fs : thisr.getAllSubRecords("PUT")) {
Record sr = fs.usesRecordId();
if (sr.isRealRecord()) {
// only deal with ones which are separate Records in the services
// get list of existing subrecords
JSONObject toDeleteList = new JSONObject();
JSONObject toUpdateList = new JSONObject();
JSONArray toCreateList = new JSONArray();
String getPath = serviceurl + filePath + "/" + sr.getServicesURL();
Integer subcount = 0;
String firstfile = "";
String[] filepaths = null;
while (!getPath.equals("")) {
JSONObject data = getListView(creds, cache, getPath, sr.getServicesListPath(), "csid", false, sr);
filepaths = (String[]) data.get("listItems");
subcount += filepaths.length;
if (firstfile.equals("") && subcount != 0) {
firstfile = filepaths[0];
}
// need to paginate // if(sr.getID().equals("termlistitem"))
for (String uri : filepaths) {
String path = uri;
if (path != null && path.startsWith("/")) {
path = path.substring(1);
}
toDeleteList.put(path, "original");
}
if (data.has("pagination")) {
Integer ps = Integer.valueOf(data.getJSONObject("pagination").getString("pageSize"));
Integer pn = Integer.valueOf(data.getJSONObject("pagination").getString("pageNum"));
Integer ti = Integer.valueOf(data.getJSONObject("pagination").getString("totalItems"));
if (ti > (ps * (pn + 1))) {
JSONObject pgRestrictions = new JSONObject();
pgRestrictions.put("pageSize", Integer.toString(ps));
pgRestrictions.put("pageNum", Integer.toString(pn + 1));
getPath = getRestrictedPath(getPath, pgRestrictions, sr.getServicesSearchKeyword(), "", false, "");
// need more values
} else {
getPath = "";
}
}
}
// how does that compare to what we need
if (sr.isType("authority")) {
// XXX need to use configuredVocabStorage
} else {
if (fs instanceof Field) {
JSONObject subdata = new JSONObject();
// loop thr jsonObject and find the fields I need
for (FieldSet subfs : sr.getAllFieldTopLevel("PUT")) {
String key = subfs.getID();
if (jsonObject.has(key)) {
subdata.put(key, jsonObject.get(key));
}
}
if (subcount == 0) {
// create
toCreateList.put(subdata);
} else {
// update - there should only be one
String firstcsid = firstfile;
toUpdateList.put(firstcsid, subdata);
toDeleteList.remove(firstcsid);
}
} else if (fs instanceof Group) {
// subrecorddata.put(value);
if (jsonObject.has(fs.getID())) {
Object subdata = jsonObject.get(fs.getID());
if (subdata instanceof JSONObject) {
if (((JSONObject) subdata).has("_subrecordcsid")) {
String thiscsid = ((JSONObject) subdata).getString("_subrecordcsid");
// update
if (toDeleteList.has(thiscsid)) {
toUpdateList.put(thiscsid, (JSONObject) subdata);
toDeleteList.remove(thiscsid);
} else {
// something has gone wrong... best just create it from scratch
toCreateList.put(subdata);
}
} else {
// create
toCreateList.put(subdata);
}
}
}
} else {
// need to find if we have csid's for each one
if (jsonObject.has(fs.getID())) {
Object subdata = jsonObject.get(fs.getID());
if (subdata instanceof JSONArray) {
JSONArray subarray = (JSONArray) subdata;
for (int i = 0; i < subarray.length(); i++) {
JSONObject subrecord = subarray.getJSONObject(i);
if (subrecord.has("_subrecordcsid") == true) {
String thiscsid = subrecord.getString("_subrecordcsid");
// update
if (toDeleteList.has(thiscsid)) {
toUpdateList.put(thiscsid, subrecord);
toDeleteList.remove(thiscsid);
} else {
// something has gone wrong... no existing records match the CSID being passed in, so
// we will try to create a new record. Could fail if a record with the same short ID already exists
toCreateList.put(subrecord);
}
} else if (subrecord.has("shortIdentifier") == true) {
String thisShortID = subrecord.getString("shortIdentifier");
// update
// See if we can find a matching short ID in the current list of items
String thiscsid = lookupCsid(cache, filepaths, serviceurl, thisShortID);
if (thiscsid != null) {
toUpdateList.put(thiscsid, subrecord);
toDeleteList.remove(thiscsid);
} else {
//
// Since we couldn't find an existing record with that short ID, we need to create it.
//
toCreateList.put(subrecord);
}
} else {
// create since we couldn't look for existing records via CSID or Short ID
toCreateList.put(subrecord);
}
}
}
}
}
String savePath = serviceurl + filePath + "/" + sr.getServicesURL() + "/";
// do delete JSONObject existingcsid = new JSONObject();
Iterator<String> rit = toDeleteList.keys();
while (rit.hasNext()) {
String key = rit.next();
// will fail if this record is a term having active references -i.e., one or more non-deleted records reference it.
deleteJSON(root, creds, cache, key, savePath, sr);
}
// do update JSONObject updatecsid = new JSONObject();
Iterator<String> keys = toUpdateList.keys();
while (keys.hasNext()) {
String key = keys.next();
JSONObject value = toUpdateList.getJSONObject(key);
JSONObject subrRestrictions = new JSONObject();
updateJSON(root, creds, cache, key, value, subrRestrictions, sr, savePath);
}
// do create JSONArray createcsid = new JSONArray();
for (int i = 0; i < toCreateList.length(); i++) {
JSONObject value = toCreateList.getJSONObject(i);
subautocreateJSON(root, creds, cache, sr, value, savePath);
}
}
}
}
// throw new ExistException("Not found: "+serviceurl+filePath);
if (status > 299 || status < 200)
throw new UnderlyingStorageException("Bad response ", status, serviceurl + filePath);
} catch (ConnectionException e) {
throw new UnderlyingStorageException("Service layer exception" + e.getLocalizedMessage(), e.getStatus(), e.getUrl(), e);
} catch (JSONException e) {
throw new UnimplementedException("JSONException", e);
} catch (UnsupportedEncodingException e) {
throw new UnimplementedException("UnsupportedEncodingException", e);
}
}
Aggregations