14 package cz.vutbr.fit.knot.annotations.web;
24 import java.io.IOException;
25 import java.io.Serializable;
26 import java.io.StringReader;
27 import java.io.StringWriter;
28 import java.util.ArrayList;
29 import java.util.Iterator;
30 import java.util.List;
31 import javax.faces.bean.ManagedBean;
32 import javax.faces.bean.ViewScoped;
33 import javax.persistence.EntityManager;
34 import javax.persistence.EntityTransaction;
35 import javax.persistence.Query;
36 import javax.xml.parsers.DocumentBuilder;
37 import javax.xml.parsers.DocumentBuilderFactory;
38 import javax.xml.parsers.ParserConfigurationException;
39 import org.apache.commons.io.IOUtils;
40 import org.apache.myfaces.custom.fileupload.UploadedFile;
41 import org.w3c.dom.Document;
42 import org.w3c.dom.Element;
43 import org.w3c.dom.NodeList;
44 import org.xml.sax.InputSource;
45 import org.xml.sax.SAXException;
89 errorMessage = MessageProvider.getMessage(
"groupMustBeSet");
93 Object[] params =
new Object[2];
96 List gList = AppBean.getPersistenceManager().queryDB(
"UserGroup.findByName", params);
98 if (gList != null && !gList.isEmpty()) {
101 errorMessage = MessageProvider.getMessage(
"unknownGroup");
111 StringWriter fWriter =
new StringWriter();
113 IOUtils.copy(uploadedFile.getInputStream(), fWriter);
114 }
catch (IOException ex) {
115 errorMessage = MessageProvider.getMessage(
"uploadingError");
120 Document changesDoc =
parseXml(fWriter.toString());
121 Element docEl = changesDoc.getDocumentElement();
123 List<AnnotType> affectedTypes =
new ArrayList<AnnotType>();
125 NodeList changeNodes = docEl.getElementsByTagName(
"change");
126 int changesCnt = changeNodes.getLength();
127 for (
int i = 0; i < changesCnt; i++) {
128 Element changeEl = (Element) changeNodes.item(i);
129 String uri = changeEl.getAttribute(
"uri");
130 if (uri == null || uri.isEmpty()) {
136 String name = changeEl.getAttribute(
"newName");
137 if (name != null && name.isEmpty()) {
142 String comment = null;
143 NodeList commentNL = changeEl.getElementsByTagName(
"comment");
144 if (commentNL.getLength() != 0) {
145 Element commentEl = (Element) commentNL.item(0);
147 while (commentEl.getParentNode() != changeEl && k < commentNL.getLength()) {
149 commentEl = (Element) commentNL.item(k);
152 if (commentEl.getParentNode() == changeEl) {
153 comment = MessageProcessor.getElementContent(commentEl);
160 if (changedTypes.isEmpty()) {
165 for (Iterator<AnnotType> chTIt = changedTypes.iterator(); chTIt.hasNext();) {
171 params[1] = chType.getId();
172 List aList = AppBean.getPersistenceManager().queryDB(
"Annotation.findByType", params);
173 if (aList != null && !aList.isEmpty()) {
175 +
" (" + chType.
getUri() +
")<br/>";
180 affectedTypes.add(chType);
182 boolean someChange =
true;
185 List<AnnotType> nowAdd =
new ArrayList<AnnotType>();
186 for (Iterator<AnnotType> afIt = affectedTypes.iterator(); afIt.hasNext();) {
189 params[0] =
"ancestor";
190 params[1] = afT.getId();
192 @SuppressWarnings(
"unchecked")
193 List<AnnotType> tList = AppBean.getPersistenceManager().queryDB(
"AnnotType.findByAncestor", params);
194 if (tList != null && !tList.isEmpty()) {
195 for (Iterator<AnnotType> tIt = tList.iterator(); tIt.hasNext();) {
197 if (!affectedTypes.contains(t) && !nowAdd.contains(t)) {
204 affectedTypes.addAll(nowAdd);
207 chType.setName(name);
212 if (comment != null) {
213 chType.setComment(comment);
217 NodeList attrNodes = changeEl.getElementsByTagName(
"attribute");
218 int attrCnt = attrNodes.getLength();
219 for (
int j = 0; j < attrCnt; j++) {
220 Element attrEl = (Element) attrNodes.item(j);
221 String aName = attrEl.getAttribute(
"name");
222 if (aName == null || aName.isEmpty()) {
228 for (Iterator<AnnotTypeAttr> attrIt = chType.
getAttributes().iterator(); attrIt.hasNext();) {
230 if (aTA.
getName().equals(aName)) {
235 if (chAttr == null) {
237 +
": " + aName +
"<br/>";
242 String newAttrName = attrEl.getAttribute(
"newName");
243 if (newAttrName != null && newAttrName.isEmpty()) {
248 if (newAttrName != null) {
249 chAttr.setName(newAttrName);
253 String attrComment = null;
254 NodeList aCNL = attrEl.getElementsByTagName(
"comment");
255 if (aCNL.getLength() != 0) {
256 Element aCEl = (Element) aCNL.item(0);
257 attrComment = MessageProcessor.getElementContent(aCEl);
261 if (attrComment != null) {
262 chAttr.setComment(attrComment);
270 for (Iterator<AnnotType> aTIt = affectedTypes.iterator(); aTIt.hasNext();) {
272 ArrayList<String> nList =
new ArrayList<String>();
273 for (Iterator<AnnotTypeAttr> aTAIt = aType.
getAttributes().iterator(); aTAIt.hasNext();) {
275 if (!nList.contains(aTA.
getName())) {
276 nList.add(aTA.getName());
280 +
": " + aTA.getName() +
"<br/>";
288 EntityManager em = AppBean.getPersistenceManager().getEM();
289 EntityTransaction transaction = em.getTransaction();
290 boolean errorOccurred =
false;
294 List<AnnotType> sTypes =
new ArrayList<AnnotType>();
296 for (Iterator<AnnotType> aTIt = affectedTypes.iterator(); aTIt.hasNext();) {
301 sType.setName(aType.getName());
302 sType.setComment(aType.getComment());
304 for (Iterator<AnnotTypeAttr> aTAIt = sType.getAttributes().iterator(); aTAIt.hasNext();) {
307 for (Iterator<AnnotTypeAttr> nATAIt = aType.
getAttributes().iterator(); nATAIt.hasNext();) {
309 if (aTA.
getId() == nATA.getId()) {
310 aTA.setName(nATA.getName());
311 aTA.setComment(nATA.getComment());
318 for (Iterator<AnnotType> sTIt = sTypes.iterator(); sTIt.hasNext();) {
320 sType.setUri(sType.getGeneratedURI());
324 for (Iterator<AnnotType> sTIt = sTypes.iterator(); sTIt.hasNext();) {
328 params[1] = type.getUri();
329 Query q = em.createNamedQuery(
"AnnotType.findByUri");
330 for (
int p = 0; p < params.length; p = p + 2) {
331 q.setParameter((String) params[p], params[p + 1]);
333 List tList = q.getResultList();
334 if (tList != null && !tList.isEmpty()) {
335 if (tList.size() > 1) {
338 +
": " + type.getUri() +
"<br/>";
339 throw new RuntimeException(
"Duplicit URIs found!");
342 throw new RuntimeException(
"Some type was not found!");
347 transaction.commit();
348 }
catch (Exception e) {
349 transaction.rollback();
359 for (Iterator<AnnotType> aTIt = affectedTypes.iterator(); aTIt.hasNext();) {
361 aType.setUri(aType.getGeneratedURI());
366 Iterator<EditorSession> sesIt = AppBean.getSessions().iterator();
367 synchronized(AppBean.getSessions()){
368 while (sesIt.hasNext()) {
372 for (Iterator<AnnotType> atIt = affectedTypes.iterator(); atIt.hasNext();) {
374 flier.AddEditedType(at);
376 es.addMessageTS(rc.createCometResponse(flier, es));
381 successMessage = MessageProvider.getMessage(
"uploadSuccessfull") +
"<br/>"
395 if (!uriPattern.contains(
"*") && uriPattern.contains(AppBean.getBaseTypeUri())) {
398 }
else if (uriPattern.contains(
"*") && uriPattern.contains(AppBean.getBaseTypeUri())) {
401 uriPattern = uriPattern.replace(
"*",
"%");
404 }
else if (!uriPattern.contains(
"*")) {
407 uriPattern = MessageProcessor.replaceArrows(uriPattern);
410 uriPattern = AppBean.getBaseTypeUri() + uriPattern;
415 String uriPatternWG = AppBean.getBaseTypeUri() +
"g" + userGroup.
getId() +
"/" + uriPattern;
421 uriPattern = uriPattern.replace(
"*",
"%");
422 uriPattern = MessageProcessor.replaceArrows(uriPattern);
425 uriPattern = AppBean.getBaseTypeUri() + uriPattern;
430 String uriPatternWG = AppBean.getBaseTypeUri() +
"g" + userGroup.
getId() +
"/" + uriPattern;
445 Object[] params =
new Object[2];
449 @SuppressWarnings(
"unchecked")
450 List<AnnotType> tList = AppBean.getPersistenceManager().queryDB(
"AnnotType.findByUri", params);
451 if (tList != null && !tList.isEmpty()) {
454 return new ArrayList<AnnotType>();
464 @SuppressWarnings(
"unchecked")
468 EntityManager em = AppBean.getPersistenceManager().getEM();
470 Query query = em.createQuery(
"SELECT a FROM AnnotType a WHERE a.uri LIKE '" + uriPattern +
"'");
471 tList = query.getResultList();
472 }
catch (Exception e) {
478 if (tList != null && !tList.isEmpty()) {
481 return new ArrayList<AnnotType>();
495 Object[] params =
new Object[2];
498 Query q = em.createNamedQuery(
"AnnotType.findByUri");
499 for (
int p = 0; p < params.length; p = p + 2) {
500 q.setParameter((String) params[p], params[p + 1]);
502 List aList = q.getResultList();
503 if (aList != null && !aList.isEmpty()) {
506 throw new RuntimeException(
"New type not found!");
598 private static Document
parseXml(String XMLString) {
600 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
601 dbf.setNamespaceAware(
true);
604 DocumentBuilder db = dbf.newDocumentBuilder();
605 InputSource is =
new InputSource();
606 is.setCharacterStream(
new StringReader(XMLString));
608 }
catch (ParserConfigurationException pce) {
610 }
catch (SAXException se) {
612 }
catch (IOException ioe) {
List< AnnotTypeAttr > getAttributes()
static boolean isGroupIncluded(String gStr)
void setErrorMessage(String errorMessage)
void setuGroup(String uGroup)
Class representing attribute of type of annotation.
Singleton for storing global variables.
Class for getting localized messages from message bundle.
void setSuccessMessage(String successMessage)
UploadedFile uploadedFile
Backbean for page for batch renaming of types of annotations.
void setUploadedFile(UploadedFile uploadedFile)
Static class which parses and process XML with messages.
Class representing user group.
List< AnnotType > getChangedTypesLike(String uriPattern)
static String getMessage(String name)
Class representing type of annotation.
Flier with informations for comet handlers.
List< AnnotType > getChangedTypeExact(String uri)
Class that creates responses and persists data.
List< AnnotType > getChangedTypes(String uriPattern, UserGroup userGroup)
String getSuccessMessage()
Informations about client session.
UploadedFile getUploadedFile()
static Document parseXml(String XMLString)
static AnnotType queryType(String uri, EntityManager em)