Skip to content

Commit 00ff8f5

Browse files
committed
1.2.16
2 parents 5dc5919 + 6cb453d commit 00ff8f5

32 files changed

Lines changed: 1034 additions & 26 deletions

File tree

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ Servers/
88
*.iml
99
.idea/**
1010
.idea
11-
/target/
11+
/target/
12+
/gumga-domain/nbproject/

RELEASE-NOTES

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,16 @@
99
Framework Backend
1010

1111

12+
1.2.16
13+
- Integração com o reconhecimento de voz
14+
- Biblioteca para interpretação de linguagem natural
15+
16+
17+
1.2.15
18+
- GumgaSharedModel (Compartilhamento de objetos)
19+
- MaximumUsersSharesExceeded
20+
21+
1222
1.2.14
1323
=======================================
1424
- Create class GumgaTenancyUtils that contains the method changeOi

gumga-application/pom.xml

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<parent>
55
<groupId>gumga.framework</groupId>
66
<artifactId>gumga-backend-all</artifactId>
7-
<version>1.2.14</version>
7+
<version>1.2.16</version>
88
</parent>
99
<artifactId>gumga-application</artifactId>
1010

@@ -124,6 +124,18 @@
124124
<groupId>net.sf.jasperreports</groupId>
125125
<artifactId>jasperreports</artifactId>
126126
</dependency>
127+
128+
<dependency>
129+
<groupId>org.cogroo.lang.pt_br</groupId>
130+
<artifactId>cogroo-ann-pt_br</artifactId>
131+
<version>4.0.0</version>
132+
</dependency>
133+
134+
<dependency>
135+
<groupId>org.reflections</groupId>
136+
<artifactId>reflections</artifactId>
137+
<version>0.9.10</version>
138+
</dependency>
127139
</dependencies>
128140

129141
<repositories>
@@ -145,4 +157,4 @@
145157
<url>http://jasperreports.sourceforge.net/maven2</url>
146158
</repository>
147159
</repositories>
148-
</project>
160+
</project>

gumga-application/src/main/java/gumga/framework/application/GumgaGenericRepository.java

Lines changed: 42 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import gumga.framework.domain.*;
1111
import gumga.framework.domain.repository.GumgaCrudRepository;
1212
import gumga.framework.domain.repository.GumgaMultitenancyUtil;
13+
import gumga.framework.domain.shared.GumgaSharedModel;
1314
import java.io.IOException;
1415
import java.io.Serializable;
1516
import java.util.ArrayList;
@@ -97,8 +98,25 @@ private Pesquisa<T> getPesquisa(QueryObject query) {
9798
if (hasMultitenancy() && GumgaThreadScope.organizationCode.get() != null) {
9899
String oiPattern = GumgaMultitenancyUtil.getMultitenancyPattern(entityInformation.getJavaType().getAnnotation(GumgaMultitenancy.class));
99100
Criterion multitenancyCriterion;
101+
Criterion sharedCriterion;
100102
GumgaMultitenancy gumgaMultitenancy = getDomainClass().getAnnotation(GumgaMultitenancy.class);
101-
if (gumgaMultitenancy.allowPublics()) {
103+
if (GumgaSharedModel.class.isAssignableFrom(entityInformation.getJavaType())) {
104+
sharedCriterion = or(
105+
// like("1","1",MatchMode.EXACT)
106+
like("gumgaOrganizations", "," + oiPattern + ",", MatchMode.ANYWHERE),
107+
like("gumgaUsers", "," + GumgaThreadScope.login.get() + ",", MatchMode.ANYWHERE)
108+
);
109+
110+
if (gumgaMultitenancy.allowPublics()) {
111+
if (gumgaMultitenancy.publicMarking() == TenancyPublicMarking.NULL) {
112+
multitenancyCriterion = or(like("oi", oiPattern, MatchMode.START), Restrictions.isNull("oi"), sharedCriterion);
113+
} else {
114+
multitenancyCriterion = or(like("oi", oiPattern, MatchMode.START), Restrictions.eq("oi", gumgaMultitenancy.publicMarking().getMark()), sharedCriterion);
115+
}
116+
} else {
117+
multitenancyCriterion = or(like("oi", oiPattern, MatchMode.START), sharedCriterion);
118+
}
119+
} else if (gumgaMultitenancy.allowPublics()) {
102120
if (gumgaMultitenancy.publicMarking() == TenancyPublicMarking.NULL) {
103121
multitenancyCriterion = or(like("oi", oiPattern, MatchMode.START), Restrictions.isNull("oi"));
104122
} else {
@@ -107,6 +125,7 @@ private Pesquisa<T> getPesquisa(QueryObject query) {
107125
} else {
108126
multitenancyCriterion = or(like("oi", oiPattern, MatchMode.START));
109127
}
128+
110129
pesquisa.add(multitenancyCriterion);
111130
}
112131

@@ -149,6 +168,16 @@ public Pesquisa<T> search() {
149168

150169
@Override
151170
public T findOne(ID id) {
171+
if (GumgaSharedModel.class.isAssignableFrom(entityInformation.getJavaType())) {
172+
QueryObject qo=new QueryObject();
173+
qo.setAq("obj.id="+id);
174+
SearchResult<T> search = this.search(qo);
175+
if (search.getCount()==1){
176+
return search.getValues().get(0);
177+
}
178+
throw new EntityNotFoundException("cannot find " + entityInformation.getJavaType() + " with id: " + id);
179+
}
180+
152181
T resource = super.findOne(id);
153182

154183
if (resource == null) {
@@ -199,16 +228,20 @@ private SearchResult<T> advancedSearch(QueryObject query) {
199228
String modelo = "from %s obj WHERE %s";
200229
if (hasMultitenancy()) {
201230
GumgaMultitenancy gumgaMultiTenancy = getDomainClass().getAnnotation(GumgaMultitenancy.class);
202-
String multitenancyPattern = GumgaMultitenancyUtil.getMultitenancyPattern(gumgaMultiTenancy);
231+
String oiPattern = GumgaMultitenancyUtil.getMultitenancyPattern(gumgaMultiTenancy);
232+
String sharedCriterion = " ";
233+
if (GumgaSharedModel.class.isAssignableFrom(entityInformation.getJavaType())) {
234+
sharedCriterion = "or (obj.gumgaOrganizations like '%%," + oiPattern + ",%%' or "
235+
+ "obj.gumgaUsers like '%%," + GumgaThreadScope.login.get() + ",%%') ";
236+
}
203237
if (gumgaMultiTenancy.allowPublics()) {
204238
if (gumgaMultiTenancy.publicMarking() == TenancyPublicMarking.NULL) {
205-
modelo = "from %s obj WHERE (obj.oi is null OR obj.oi like '" + multitenancyPattern + "%%') AND (%s) ";
206-
}
207-
else{
208-
modelo = "from %s obj WHERE (obj.oi = '" + gumgaMultiTenancy.publicMarking().getMark() + "' OR obj.oi like '" + multitenancyPattern + "%%') AND (%s) ";
239+
modelo = "from %s obj WHERE (obj.oi is null OR obj.oi like '" + oiPattern + "%%' " + sharedCriterion + ") AND (%s) ";
240+
} else {
241+
modelo = "from %s obj WHERE (obj.oi = '" + gumgaMultiTenancy.publicMarking().getMark() + "' OR obj.oi like '" + oiPattern + "%%' " + sharedCriterion + ") AND (%s) ";
209242
}
210243
} else {
211-
modelo = "from %s obj WHERE (obj.oi like '" + multitenancyPattern + "%%') AND (%s) ";
244+
modelo = "from %s obj WHERE (obj.oi like '" + oiPattern + "%%' " + sharedCriterion + ") AND (%s) ";
212245
}
213246
}
214247

@@ -448,15 +481,15 @@ public void delete(Iterable<? extends T> entities) {
448481
@Override
449482
public void delete(T entity) {
450483
if (hasMultitenancy()) {
451-
log.error("NOMULTITENACYIMPL -> " + noMultiTenancyMessage());
484+
checkOwnership(entity);
452485
}
453486
super.delete(entity);
454487
}
455488

456489
@Override
457490
public void delete(ID id) {
458491
if (hasMultitenancy()) {
459-
log.error("NOMULTITENACYIMPL -> " + noMultiTenancyMessage());
492+
checkOwnership(findOne(id));
460493
}
461494
super.delete(id);
462495
}
Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
package gumga.framework.application.nlp;
2+
3+
import gumga.framework.core.GumgaValues;
4+
import gumga.framework.domain.nlp.GumgaNLPThing;
5+
import java.lang.reflect.Field;
6+
import java.util.ArrayList;
7+
import java.util.Arrays;
8+
import java.util.HashMap;
9+
import java.util.List;
10+
import java.util.Locale;
11+
import java.util.Map;
12+
import java.util.Set;
13+
import org.cogroo.analyzer.Analyzer;
14+
import org.cogroo.analyzer.ComponentFactory;
15+
import org.cogroo.text.Chunk;
16+
import org.cogroo.text.Document;
17+
import org.cogroo.text.Sentence;
18+
import org.cogroo.text.SyntacticChunk;
19+
import org.cogroo.text.Token;
20+
import org.cogroo.text.impl.DocumentImpl;
21+
import org.reflections.Reflections;
22+
import org.springframework.beans.factory.annotation.Autowired;
23+
import org.springframework.stereotype.Component;
24+
25+
@Component
26+
public class GumgaNLP {
27+
28+
public static final String NO_NAME = "_NO_NAME";
29+
private final Analyzer cogroo;
30+
private final Reflections reflections;
31+
private final Set<Class<?>> classOfInterest;
32+
33+
@Autowired
34+
public GumgaNLP(GumgaValues gumgaValues) {
35+
String basePackage = gumgaValues.getGumgaNLPBasePackage();
36+
ComponentFactory factory = ComponentFactory.create(new Locale("pt", "BR"));
37+
cogroo = factory.createPipe();
38+
reflections = new Reflections(basePackage);
39+
System.out.println("ReflectionsConfiguration------->" + reflections.getConfiguration().getUrls());
40+
classOfInterest = reflections.getTypesAnnotatedWith(GumgaNLPThing.class);
41+
System.out.println("GumgaNLP ------" + basePackage + "----->" + classOfInterest);
42+
}
43+
44+
private enum Estados {
45+
VERBO, SUBSTANTIVO, FIM, ATRIBUTOS, VALOR_ATRIBUTO
46+
};
47+
48+
public List<Object> createObjectsFromDocument(String text, String instanceVerbs) throws Exception {
49+
List<String> verbs = Arrays.asList(instanceVerbs.split(","));
50+
Document document = new DocumentImpl();
51+
document.setText(text);
52+
cogroo.analyze(document);
53+
print(document);
54+
ArrayList<Object> toReturn = new ArrayList<>();
55+
Object currentObject = null;
56+
Field currentField = null;
57+
Estados estado = Estados.VERBO;
58+
59+
for (Sentence sentence : document.getSentences()) {
60+
int i = 0;
61+
List<Token> tokens = sentence.getTokens();
62+
while (i < tokens.size()) {
63+
System.out.print(estado + " ");
64+
Token token = sentence.getTokens().get(i);
65+
if (token.getPOSTag().startsWith("v-")) {
66+
for (String v : verbs) {
67+
if (Arrays.asList(token.getLemmas()).contains(v)) {
68+
estado = Estados.SUBSTANTIVO;
69+
}
70+
}
71+
} else if (estado == Estados.SUBSTANTIVO && token.getPOSTag().startsWith("n")) {
72+
Class classe = null;
73+
for (Class c : classOfInterest) {
74+
GumgaNLPThing gumgaNPLThing = (GumgaNLPThing) c.getAnnotation(GumgaNLPThing.class);
75+
String nome = (NO_NAME.equals(gumgaNPLThing.value()) ? c.getSimpleName() : gumgaNPLThing.value()).toLowerCase();
76+
if (nome.equals(token.getLexeme())) {
77+
currentObject = c.newInstance();
78+
toReturn.add(currentObject);
79+
estado = Estados.ATRIBUTOS;
80+
}
81+
}
82+
} else if (estado == Estados.ATRIBUTOS && token.getPOSTag().startsWith("n")) {
83+
try {
84+
currentField = mapAllFields(currentObject.getClass()).get(token.getLexeme()); //currentObject.getClass().getDeclaredField(token.getLexeme());tod
85+
estado = Estados.VALOR_ATRIBUTO;
86+
} catch (NullPointerException nfe) {
87+
88+
}
89+
} else if (estado == Estados.VALOR_ATRIBUTO && (!token.getPOSTag().startsWith("prp"))) {
90+
try {
91+
currentField.setAccessible(true);
92+
currentField.set(currentObject, currentField.getType().getConstructor(String.class).newInstance(token.getLexeme().toLowerCase()));
93+
estado = Estados.ATRIBUTOS;
94+
} catch (Exception ex) {
95+
ex.printStackTrace();
96+
}
97+
}
98+
i++;
99+
}
100+
101+
}
102+
System.out.println("---------->" + toReturn);
103+
return toReturn;
104+
105+
}
106+
107+
private Map<String, Field> mapAllFields(Class clazz) {
108+
Map<String, Field> toReturn;
109+
if (clazz.getSuperclass().equals(Object.class)) {
110+
toReturn = new HashMap<>();
111+
} else {
112+
toReturn = mapAllFields(clazz.getSuperclass());
113+
}
114+
Field[] declaredFields = clazz.getDeclaredFields();
115+
for (Field f : declaredFields) {
116+
String label = f.getName();
117+
if (f.isAnnotationPresent(GumgaNLPThing.class)) {
118+
GumgaNLPThing annotation = f.getAnnotation(GumgaNLPThing.class);
119+
label = annotation.value();
120+
}
121+
toReturn.put(label, f);
122+
}
123+
return toReturn;
124+
125+
}
126+
127+
private void print(Document document) {
128+
StringBuilder output = new StringBuilder();
129+
for (Sentence sentence : document.getSentences()) {
130+
output.append("Sentence: ").append(sentence.getText()).append("\n");
131+
output.append(" Tokens: \n");
132+
for (Token token : sentence.getTokens()) {
133+
String lexeme = token.getLexeme();
134+
String lemmas = Arrays.toString(token.getLemmas());
135+
String pos = token.getPOSTag();
136+
String feat = token.getFeatures();
137+
output.append(String.format(" %-10s %-12s %-6s %-10s\n", lexeme, lemmas, pos, feat));
138+
}
139+
output.append(" Chunks: ");
140+
for (Chunk chunk : sentence.getChunks()) {
141+
output.append("[").append(chunk.getTag()).append(": ");
142+
for (Token innerToken : chunk.getTokens()) {
143+
output.append(innerToken.getLexeme()).append(" ");
144+
}
145+
output.append("] ");
146+
}
147+
output.append("\n");
148+
output.append(" Shallow Structure: ");
149+
for (SyntacticChunk structure : sentence.getSyntacticChunks()) {
150+
output.append("[").append(structure.getTag()).append(": ");
151+
for (Token innerToken : structure.getTokens()) {
152+
output.append(innerToken.getLexeme()).append(" ");
153+
}
154+
output.append("] ");
155+
}
156+
output.append("\n");
157+
}
158+
System.out.println(output.toString());
159+
}
160+
161+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package gumga.framework.application;
2+
3+
import gumga.framework.domain.GumgaModel;
4+
import gumga.framework.domain.GumgaMultitenancy;
5+
import gumga.framework.domain.customfields.GumgaCustomizableModel;
6+
import gumga.framework.domain.shared.GumgaSharedModel;
7+
import javax.persistence.Entity;
8+
import javax.persistence.SequenceGenerator;
9+
10+
@Entity
11+
@SequenceGenerator(name = GumgaModel.SEQ_NAME, sequenceName = "SEQ_BUS")
12+
@GumgaMultitenancy
13+
public class Bus extends GumgaSharedModel<Long> {
14+
15+
public Bus() {
16+
17+
}
18+
19+
public Bus(String line) {
20+
this.line = line;
21+
}
22+
23+
private String line;
24+
25+
public String getLine() {
26+
return line;
27+
}
28+
29+
public void setLine(String line) {
30+
this.line = line;
31+
}
32+
33+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package gumga.framework.application;
2+
3+
import gumga.framework.domain.repository.GumgaCrudRepository;
4+
import gumga.framework.domain.repository.GumgaQueryDSLRepository;
5+
6+
/**
7+
* Repositorio de onibus
8+
*/
9+
public interface BusRepository extends GumgaCrudRepository<Bus,Long> {
10+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package gumga.framework.application;
2+
3+
import org.springframework.beans.factory.annotation.Autowired;
4+
import org.springframework.stereotype.Service;
5+
6+
@Service
7+
public class BusService extends GumgaService<Bus, Long> {
8+
9+
@Autowired
10+
public BusService(BusRepository repository) {
11+
super(repository);
12+
}
13+
14+
@Override
15+
public void delete(Bus resource) {
16+
super.delete(resource); //To change body of generated methods, choose Tools | Templates.
17+
}
18+
19+
20+
21+
}

0 commit comments

Comments
 (0)