use of org.hisp.dhis.schema.Schema in project dhis2-core by dhis2.
the class DefaultRenderService method fromMetadata.
@Override
@SuppressWarnings("unchecked")
public Map<Class<? extends IdentifiableObject>, List<IdentifiableObject>> fromMetadata(InputStream inputStream, RenderFormat format) throws IOException {
Map<Class<? extends IdentifiableObject>, List<IdentifiableObject>> map = new HashMap<>();
ObjectMapper mapper;
if (RenderFormat.JSON == format) {
mapper = jsonMapper;
} else if (RenderFormat.XML == format) {
throw new IllegalArgumentException("XML format is not supported.");
} else {
return map;
}
JsonNode rootNode = mapper.readTree(inputStream);
Iterator<String> fieldNames = rootNode.fieldNames();
while (fieldNames.hasNext()) {
String fieldName = fieldNames.next();
JsonNode node = rootNode.get(fieldName);
Schema schema = schemaService.getSchemaByPluralName(fieldName);
if (schema == null || !schema.isIdentifiableObject()) {
log.info("Skipping unknown property '" + fieldName + "'.");
continue;
}
if (!schema.isMetadata()) {
log.debug("Skipping non-metadata property `" + fieldName + "`.");
continue;
}
List<IdentifiableObject> collection = new ArrayList<>();
for (JsonNode item : node) {
IdentifiableObject value = mapper.treeToValue(item, (Class<? extends IdentifiableObject>) schema.getKlass());
if (value != null)
collection.add(value);
}
map.put((Class<? extends IdentifiableObject>) schema.getKlass(), collection);
}
return map;
}
use of org.hisp.dhis.schema.Schema in project dhis2-core by dhis2.
the class DefaultQueryParser method getProperty.
@Override
public Property getProperty(Schema schema, String path) throws QueryParserException {
String[] paths = path.split("\\.");
Schema currentSchema = schema;
Property currentProperty = null;
for (int i = 0; i < paths.length; i++) {
if (!currentSchema.haveProperty(paths[i])) {
return null;
}
currentProperty = currentSchema.getProperty(paths[i]);
if (currentProperty == null) {
throw new QueryParserException("Unknown path property: " + paths[i] + " (" + path + ")");
}
if ((currentProperty.isSimple() && !currentProperty.isCollection()) && i != (paths.length - 1)) {
throw new QueryParserException("Simple type was found before finished parsing path expression, please check your path string.");
}
if (currentProperty.isCollection()) {
currentSchema = schemaService.getDynamicSchema(currentProperty.getItemKlass());
} else {
currentSchema = schemaService.getDynamicSchema(currentProperty.getKlass());
}
}
return currentProperty;
}
use of org.hisp.dhis.schema.Schema in project dhis2-core by dhis2.
the class DefaultQueryPlanner method getQueryPath.
@Override
public QueryPath getQueryPath(Schema schema, String path) {
Schema curSchema = schema;
Property curProperty = null;
boolean persisted = true;
List<String> alias = new ArrayList<>();
String[] pathComponents = path.split("\\.");
if (pathComponents.length == 0) {
return null;
}
for (int idx = 0; idx < pathComponents.length; idx++) {
String name = pathComponents[idx];
curProperty = curSchema.getProperty(name);
if (curProperty == null) {
throw new RuntimeException("Invalid path property: " + name);
}
if (!curProperty.isPersisted()) {
persisted = false;
}
if ((!curProperty.isSimple() && idx == pathComponents.length - 1)) {
return new QueryPath(curProperty, persisted, alias.toArray(new String[] {}));
}
if (curProperty.isCollection()) {
curSchema = schemaService.getDynamicSchema(curProperty.getItemKlass());
alias.add(curProperty.getFieldName());
} else if (!curProperty.isSimple()) {
curSchema = schemaService.getDynamicSchema(curProperty.getKlass());
alias.add(curProperty.getFieldName());
} else {
return new QueryPath(curProperty, persisted, alias.toArray(new String[] {}));
}
}
return new QueryPath(curProperty, persisted, alias.toArray(new String[] {}));
}
use of org.hisp.dhis.schema.Schema in project dhis2-core by dhis2.
the class CategoryOptionComboSchemaDescriptor method getSchema.
@Override
public Schema getSchema() {
Schema schema = new Schema(DataElementCategoryOptionCombo.class, SINGULAR, PLURAL);
schema.setRelativeApiEndpoint(API_ENDPOINT);
schema.setOrder(1190);
schema.getAuthorities().add(new Authority(AuthorityType.CREATE, Lists.newArrayList("F_CATEGORY_COMBO_PUBLIC_ADD", "F_CATEGORY_COMBO_PRIVATE_ADD")));
schema.getAuthorities().add(new Authority(AuthorityType.DELETE, Lists.newArrayList("F_CATEGORY_COMBO_DELETE")));
return schema;
}
use of org.hisp.dhis.schema.Schema in project dhis2-core by dhis2.
the class DefaultPreheatService method preheat.
@Override
@SuppressWarnings("unchecked")
public Preheat preheat(PreheatParams params) {
Timer timer = new SystemTimer().start();
Preheat preheat = new Preheat();
preheat.setUser(params.getUser());
preheat.setDefaults(manager.getDefaults());
if (preheat.getUser() == null) {
preheat.setUser(currentUserService.getCurrentUser());
}
preheat.put(PreheatIdentifier.UID, preheat.getUser());
preheat.put(PreheatIdentifier.CODE, preheat.getUser());
for (Class<? extends IdentifiableObject> klass : params.getObjects().keySet()) {
params.getObjects().get(klass).stream().filter(identifiableObject -> StringUtils.isEmpty(identifiableObject.getUid())).forEach(identifiableObject -> ((BaseIdentifiableObject) identifiableObject).setUid(CodeGenerator.generateUid()));
}
Map<Class<? extends IdentifiableObject>, List<IdentifiableObject>> uniqueCollectionMap = new HashMap<>();
Set<Class<? extends IdentifiableObject>> klasses = new HashSet<>(params.getObjects().keySet());
if (PreheatMode.ALL == params.getPreheatMode()) {
if (params.getClasses().isEmpty()) {
schemaService.getMetadataSchemas().stream().filter(Schema::isIdentifiableObject).forEach(schema -> params.getClasses().add((Class<? extends IdentifiableObject>) schema.getKlass()));
}
for (Class<? extends IdentifiableObject> klass : params.getClasses()) {
Query query = Query.from(schemaService.getDynamicSchema(klass));
query.setUser(preheat.getUser());
List<? extends IdentifiableObject> objects = queryService.query(query);
if (PreheatIdentifier.UID == params.getPreheatIdentifier() || PreheatIdentifier.AUTO == params.getPreheatIdentifier()) {
preheat.put(PreheatIdentifier.UID, objects);
}
if (PreheatIdentifier.CODE == params.getPreheatIdentifier() || PreheatIdentifier.AUTO == params.getPreheatIdentifier()) {
preheat.put(PreheatIdentifier.CODE, objects);
}
if (klasses.contains(klass) && !objects.isEmpty()) {
uniqueCollectionMap.put(klass, new ArrayList<>(objects));
}
}
} else if (PreheatMode.REFERENCE == params.getPreheatMode()) {
Map<PreheatIdentifier, Map<Class<? extends IdentifiableObject>, Set<String>>> references = collectReferences(params.getObjects());
Map<Class<? extends IdentifiableObject>, Set<String>> uidMap = references.get(PreheatIdentifier.UID);
Map<Class<? extends IdentifiableObject>, Set<String>> codeMap = references.get(PreheatIdentifier.CODE);
if (uidMap != null && (PreheatIdentifier.UID == params.getPreheatIdentifier() || PreheatIdentifier.AUTO == params.getPreheatIdentifier())) {
for (Class<? extends IdentifiableObject> klass : uidMap.keySet()) {
List<List<String>> identifiers = Lists.partition(Lists.newArrayList(uidMap.get(klass)), 20000);
if (!identifiers.isEmpty()) {
for (List<String> ids : identifiers) {
Query query = Query.from(schemaService.getDynamicSchema(klass));
query.setUser(preheat.getUser());
query.add(Restrictions.in("id", ids));
List<? extends IdentifiableObject> objects = queryService.query(query);
preheat.put(PreheatIdentifier.UID, objects);
}
}
}
}
if (codeMap != null && (PreheatIdentifier.CODE == params.getPreheatIdentifier() || PreheatIdentifier.AUTO == params.getPreheatIdentifier())) {
for (Class<? extends IdentifiableObject> klass : codeMap.keySet()) {
List<List<String>> identifiers = Lists.partition(Lists.newArrayList(codeMap.get(klass)), 20000);
if (!identifiers.isEmpty()) {
for (List<String> ids : identifiers) {
Query query = Query.from(schemaService.getDynamicSchema(klass));
query.setUser(preheat.getUser());
query.add(Restrictions.in("code", ids));
List<? extends IdentifiableObject> objects = queryService.query(query);
preheat.put(PreheatIdentifier.CODE, objects);
}
}
}
}
for (Class<? extends IdentifiableObject> klass : klasses) {
Query query = Query.from(schemaService.getDynamicSchema(klass));
query.setUser(preheat.getUser());
List<? extends IdentifiableObject> objects = queryService.query(query);
if (!objects.isEmpty()) {
uniqueCollectionMap.put(klass, new ArrayList<>(objects));
}
}
}
if (uniqueCollectionMap.containsKey(User.class)) {
List<IdentifiableObject> userCredentials = new ArrayList<>();
for (IdentifiableObject identifiableObject : uniqueCollectionMap.get(User.class)) {
User user = (User) identifiableObject;
if (user.getUserCredentials() != null) {
userCredentials.add(user.getUserCredentials());
}
}
uniqueCollectionMap.put(UserCredentials.class, userCredentials);
}
preheat.setUniquenessMap(collectUniqueness(uniqueCollectionMap));
// add preheat placeholders for objects that will be created and set mandatory/unique attributes
for (Class<? extends IdentifiableObject> klass : params.getObjects().keySet()) {
List<IdentifiableObject> objects = params.getObjects().get(klass);
preheat.put(params.getPreheatIdentifier(), objects);
}
handleAttributes(params.getObjects(), preheat);
handleSecurity(params.getObjects(), params.getPreheatIdentifier(), preheat);
periodStore.getAll().forEach(period -> preheat.getPeriodMap().put(period.getName(), period));
periodStore.getAllPeriodTypes().forEach(periodType -> preheat.getPeriodTypeMap().put(periodType.getName(), periodType));
log.info("(" + preheat.getUsername() + ") Import:Preheat[" + params.getPreheatMode() + "] took " + timer.toString());
return preheat;
}
Aggregations