df620812845917c3e9dc0ca71c68f17b7bcd815f
[cdmlib.git] / cdmlib-io / src / main / java / eu / etaxonomy / cdm / io / tcs / TcsReferenceIO.java
1 /**
2 *
3 */
4 package eu.etaxonomy.cdm.io.tcs;
5
6 import static eu.etaxonomy.cdm.io.common.ImportHelper.OBLIGATORY;
7 import static eu.etaxonomy.cdm.io.common.ImportHelper.OVERWRITE;
8
9 import java.util.HashSet;
10 import java.util.List;
11 import java.util.Map;
12 import java.util.Set;
13
14 import org.apache.log4j.Logger;
15 import org.jdom.Attribute;
16 import org.jdom.Element;
17 import org.jdom.Namespace;
18
19 import eu.etaxonomy.cdm.api.application.CdmApplicationController;
20 import eu.etaxonomy.cdm.api.service.IReferenceService;
21 import eu.etaxonomy.cdm.common.CdmUtils;
22 import eu.etaxonomy.cdm.common.XmlHelp;
23 import eu.etaxonomy.cdm.io.common.ICdmIO;
24 import eu.etaxonomy.cdm.io.common.IImportConfigurator;
25 import eu.etaxonomy.cdm.io.common.ImportHelper;
26 import eu.etaxonomy.cdm.io.common.MapWrapper;
27 import eu.etaxonomy.cdm.model.agent.Team;
28 import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
29 import eu.etaxonomy.cdm.model.common.CdmBase;
30 import eu.etaxonomy.cdm.model.common.TimePeriod;
31 import eu.etaxonomy.cdm.model.reference.Article;
32 import eu.etaxonomy.cdm.model.reference.Book;
33 import eu.etaxonomy.cdm.model.reference.BookSection;
34 import eu.etaxonomy.cdm.model.reference.Generic;
35 import eu.etaxonomy.cdm.model.reference.Journal;
36 import eu.etaxonomy.cdm.model.reference.ReferenceBase;
37 import eu.etaxonomy.cdm.model.reference.StrictReferenceBase;
38 import eu.etaxonomy.cdm.strategy.exceptions.UnknownCdmTypeException;
39
40 /**
41 * @author a.mueller
42 *
43 */
44 public class TcsReferenceIO extends TcsIoBase implements ICdmIO {
45 private static final Logger logger = Logger.getLogger(TcsReferenceIO.class);
46
47 private static int modCount = 1000;
48
49 public TcsReferenceIO(){
50 super();
51 }
52
53 @Override
54 public boolean doCheck(IImportConfigurator config){
55 boolean result = true;
56 result &= checkArticlesWithoutJournal(config);
57 //result &= checkPartOfJournal(config);
58
59 return result;
60 }
61
62 private static boolean checkArticlesWithoutJournal(IImportConfigurator bmiConfig){
63 try {
64 boolean result = true;
65 //TODO
66 // result = firstRow = false;
67 // }
68 //
69 return result;
70 } catch (Exception e) {
71 e.printStackTrace();
72 return false;
73 }
74 }
75
76
77 protected static CdmIoXmlMapperBase[] standardMappers = new CdmIoXmlMapperBase[]{
78 //new CdmTextElementMapper("edition", "edition"),
79 new CdmTextElementMapper("volume", "volume"),
80 new CdmTextElementMapper("placePublished", "placePublished"),
81 new CdmTextElementMapper("publisher", "publisher"),
82 //new CdmTextElementMapper("isbn", "isbn"),
83 new CdmTextElementMapper("pages", "pages"),
84 //new CdmTextElementMapper("series", "series"),
85 //new CdmTextElementMapper("issn", "issn"),
86 //new CdmTextElementMapper("url", "uri")
87 };
88
89 protected static CdmIoXmlMapperBase[] operationalMappers = new CdmIoXmlMapperBase[]{
90 new CdmUnclearMapper("year")
91 , new CdmUnclearMapper("title")
92 , new CdmUnclearMapper("shortTitle")
93 , new CdmUnclearMapper("publicationType")
94 , new CdmUnclearMapper("parentPublication")
95 , new CdmUnclearMapper("authorship")
96
97 };
98
99 // protected static String[] createdAndNotesAttributes = new String[]{
100 // "created_When", "updated_When", "created_Who", "updated_Who", "notes"
101 // };
102
103 protected static CdmIoXmlMapperBase[] unclearMappers = new CdmIoXmlMapperBase[]{
104
105 };
106
107
108
109 private boolean makeStandardMapper(Element parentElement, StrictReferenceBase ref, Set<String> omitAttributes){
110 if (omitAttributes == null){
111 omitAttributes = new HashSet<String>();
112 }
113 boolean result = true;
114 for (CdmIoXmlMapperBase mapper : standardMappers){
115 Object value = getValue(mapper, parentElement);
116 //write to destination
117 if (value != null){
118 String destinationAttribute = mapper.getDestinationAttribute();
119 if (! omitAttributes.contains(destinationAttribute)){
120 result &= ImportHelper.addValue(value, ref, destinationAttribute, mapper.getTypeClass(), OVERWRITE, OBLIGATORY);
121 }
122 }
123 }
124 return true;
125 }
126
127 private Object getValue(CdmIoXmlMapperBase mapper, Element parentElement){
128 String sourceAttribute = mapper.getSourceAttribute().toLowerCase();
129 Namespace sourceNamespace = mapper.getSourceNamespace(parentElement);
130 Element child = parentElement.getChild(sourceAttribute, sourceNamespace);
131 if (child == null){
132 return null;
133 }
134 if (child.getContentSize() > 1){
135 logger.warn("Element is not String");
136 }
137 Object value = child.getTextTrim();
138 return value;
139 }
140
141 @Override
142 public boolean doInvoke(IImportConfigurator config, CdmApplicationController cdmApp,
143 Map<String, MapWrapper<? extends CdmBase>> stores){
144
145 MapWrapper<ReferenceBase> referenceMap = (MapWrapper<ReferenceBase>)stores.get(ICdmIO.REFERENCE_STORE);
146 MapWrapper<ReferenceBase> nomRefMap = (MapWrapper<ReferenceBase>)stores.get(ICdmIO.NOMREF_STORE);
147 MapWrapper<TeamOrPersonBase> authorMap = (MapWrapper<TeamOrPersonBase>)stores.get(ICdmIO.AUTHOR_STORE);
148
149 // MapWrapper<ReferenceBase> referenceStore= new MapWrapper<ReferenceBase>(null);
150 // MapWrapper<ReferenceBase> nomRefStore= new MapWrapper<ReferenceBase>(null);
151
152 TcsImportConfigurator tcsConfig = (TcsImportConfigurator)config;
153 Element root = tcsConfig.getSourceRoot();
154 logger.info("start makeReferences ...");
155
156 String tcsElementName;
157 Namespace tcsNamespace;
158 String cdmAttrName;
159 String value;
160 boolean success = true;
161 IReferenceService referenceService = cdmApp.getReferenceService();
162
163
164 //Map<Integer, ReferenceBase> referenceCollectionMap = new HashMap<Integer, ReferenceBase>();
165
166 Namespace rdfNamespace = root.getNamespace();
167 String prefix = "tcom";
168 Namespace commonNamespace = root.getNamespace(prefix);
169 prefix = "tpub";
170 Namespace publicationNamespace = root.getNamespace(prefix);
171
172
173
174 tcsElementName = "PublicationCitation";
175 tcsNamespace = publicationNamespace;
176 List<Element> elPublicationCitations = root.getChildren(tcsElementName, tcsNamespace);
177
178 int nomRefCount = 0;
179 int biblioRefsCount = 0;
180
181 int i = 0;
182 //for each taxonName
183 for (Element elPublicationCitation : elPublicationCitations){
184
185 if ((++i % modCount) == 0){ logger.info("references handled: " + (i-1));}
186
187 //create TaxonName element
188 String strAbout = elPublicationCitation.getAttributeValue("about", rdfNamespace);
189
190 tcsElementName = "publicationType";
191 tcsNamespace = publicationNamespace;
192 String strPubType = XmlHelp.getChildAttributeValue(elPublicationCitation, tcsElementName, tcsNamespace, "resource", rdfNamespace);
193
194 try {
195 StrictReferenceBase ref = TcsTransformer.pubTypeStr2PubType(strPubType);
196 if (ref==null){
197 ref = Generic.NewInstance();
198 }
199
200 Set<String> omitAttributes = null;
201 makeStandardMapper(elPublicationCitation, ref, omitAttributes);
202
203
204 tcsElementName = "authorship";
205 tcsNamespace = publicationNamespace;
206 String strAuthorship = elPublicationCitation.getChildText(tcsElementName, tcsNamespace);
207 //TODO
208 TeamOrPersonBase authorTeam = Team.NewInstance();
209 authorTeam.setTitleCache(strAuthorship);
210 ref.setAuthorTeam(authorTeam);
211
212 tcsElementName = "year";
213 tcsNamespace = publicationNamespace;
214 String strYear = elPublicationCitation.getChildText(tcsElementName, tcsNamespace);
215 TimePeriod datePublished = ImportHelper.getDatePublished(strYear);
216 ref.setDatePublished(datePublished);
217
218 //Reference
219 //TODO
220 tcsElementName = "parentPublication";
221 tcsNamespace = publicationNamespace;
222 String strParent = XmlHelp.getChildAttributeValue(elPublicationCitation, tcsElementName, tcsNamespace, "resource", rdfNamespace);
223 ReferenceBase parent = referenceMap.get(strParent);
224 if (parent != null){
225 if ((ref instanceof Article) && (parent instanceof Journal)){
226 ((Article)ref).setInJournal((Journal)parent);
227 }else if ((ref instanceof BookSection) && (parent instanceof Book)){
228 ((BookSection)ref).setInBook((Book)parent);
229 }else{
230 logger.warn("parent type (parent: " + parent.getClass().getSimpleName() +", child("+strAbout+"): " + ref.getClass().getSimpleName() + ")not yet implemented");
231 //ref.setParent(parent);
232 }
233 }
234
235
236 //FIXME
237 //nomRef and reference
238 tcsElementName = "shortTitle";
239 tcsNamespace = publicationNamespace;
240 boolean nomRefExists = false;
241 String strShortTitle = elPublicationCitation.getChildText(tcsElementName, tcsNamespace);
242 if (! CdmUtils.Nz(strShortTitle).trim().equals("")){
243 ref.setTitle(strShortTitle);
244 nomRefMap.put(strAbout, ref);
245 nomRefCount++;
246 nomRefExists = true;
247 }
248
249 tcsElementName = "title";
250 tcsNamespace = publicationNamespace;
251 String strTitle = elPublicationCitation.getChildText(tcsElementName, tcsNamespace);
252 tcsNamespace = publicationNamespace;
253 if (! CdmUtils.Nz(strTitle).trim().equals("") || nomRefExists == false){
254 //TODO
255 StrictReferenceBase biblioRef = (StrictReferenceBase)ref.clone();
256 biblioRef.setTitle(strTitle);
257 referenceMap.put(strAbout, biblioRef);
258 biblioRefsCount++;
259 }
260
261 checkAdditionalContents(elPublicationCitation, standardMappers, operationalMappers, unclearMappers);
262
263
264 //ImportHelper.setOriginalSource(nameBase, tcsConfig.getSourceReference(), nameId);
265
266 } catch (UnknownCdmTypeException e) {
267 //FIXME
268 logger.warn("Name with id " + strAbout + " has unknown type " + strPubType + " and could not be saved.");
269 success = false;
270 }
271 }
272
273 //change conceptRef uuid
274 ReferenceBase sec = referenceMap.get(config.getSourceSecId());
275 if (sec == null){
276 sec = nomRefMap.get(config.getSourceSecId());
277 }
278 if (sec != null){
279 sec.setUuid(config.getSecUuid());
280 logger.info("concept reference uuid changed to: " + config.getSecUuid());
281 }
282
283
284 //save and store in map
285 logger.info("Save nomenclatural references (" + nomRefCount + ")");
286 referenceService.saveReferenceAll(nomRefMap.objects());
287 logger.info("Save bibliographical references (" + biblioRefsCount +")");
288 referenceService.saveReferenceAll(referenceMap.objects());
289
290 //referenceService.saveReferenceAll(referenceMap.objects());
291 logger.info("end makeReferences ...");
292 return success;
293 }
294
295 /* (non-Javadoc)
296 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)
297 */
298 protected boolean isIgnore(IImportConfigurator config){
299 return (config.getDoReferences() == IImportConfigurator.DO_REFERENCES.NONE);
300 }
301
302 }