\r
package eu.etaxonomy.cdm.io.berlinModel.in;\r
\r
+import java.net.URI;\r
import java.sql.ResultSet;\r
import java.sql.SQLException;\r
import java.util.ArrayList;\r
import org.apache.commons.lang.StringUtils;\r
import org.apache.log4j.Logger;\r
import org.springframework.stereotype.Component;\r
+import org.springframework.transaction.TransactionStatus;\r
\r
import eu.etaxonomy.cdm.common.CdmUtils;\r
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;\r
import eu.etaxonomy.cdm.io.berlinModel.in.validation.BerlinModelOccurrenceImportValidator;\r
import eu.etaxonomy.cdm.io.common.IOValidator;\r
import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;\r
+import eu.etaxonomy.cdm.io.common.Source;\r
import eu.etaxonomy.cdm.io.common.TdwgAreaProvider;\r
import eu.etaxonomy.cdm.model.common.Annotation;\r
import eu.etaxonomy.cdm.model.common.AnnotationType;\r
import eu.etaxonomy.cdm.model.common.CdmBase;\r
+import eu.etaxonomy.cdm.model.common.ExtensionType;\r
+import eu.etaxonomy.cdm.model.common.Language;\r
import eu.etaxonomy.cdm.model.common.Marker;\r
import eu.etaxonomy.cdm.model.common.MarkerType;\r
+import eu.etaxonomy.cdm.model.common.OriginalSourceType;\r
+import eu.etaxonomy.cdm.model.common.TermType;\r
+import eu.etaxonomy.cdm.model.common.TermVocabulary;\r
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;\r
import eu.etaxonomy.cdm.model.description.Distribution;\r
import eu.etaxonomy.cdm.model.description.PresenceAbsenceTermBase;\r
*/\r
@Component\r
public class BerlinModelOccurrenceImport extends BerlinModelImportBase {\r
+ private static final String EM_AREA_NAMESPACE = "emArea";\r
+\r
private static final Logger logger = Logger.getLogger(BerlinModelOccurrenceImport.class);\r
\r
public static final String NAMESPACE = "Occurrence";\r
super(dbTableName, pluralString);\r
}\r
\r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getIdQuery()\r
- */\r
@Override\r
protected String getIdQuery(BerlinModelImportState state) {\r
String result = " SELECT occurrenceId FROM " + getTableName();\r
return result;\r
}\r
\r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getRecordQuery(eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator)\r
- */\r
@Override\r
protected String getRecordQuery(BerlinModelImportConfigurator config) {\r
String emCode = config.isIncludesAreaEmCode()? ", emArea.EMCode" : "";\r
return strQuery;\r
}\r
\r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#doPartition(eu.etaxonomy.cdm.io.berlinModel.in.ResultSetPartitioner, eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState)\r
+ private Map<Integer, NamedArea> euroMedAreas = new HashMap<Integer, NamedArea>();\r
+ \r
+ \r
+ @Override\r
+ public boolean invoke(BerlinModelImportState state) {\r
+ if (state.getConfig().isUseEmAreaVocabulary()){\r
+ try {\r
+ createEuroMedAreas(state);\r
+ } catch (Exception e) {\r
+ logger.error("Exception occurred when trying to create euroMed Areas");\r
+ e.printStackTrace();\r
+ }\r
+ }\r
+ boolean result = super.invoke(state);\r
+ euroMedAreas = new HashMap<Integer, NamedArea>();\r
+ return result;\r
+ }\r
+ \r
+ private TermVocabulary<NamedArea> createEuroMedAreas(BerlinModelImportState state) throws SQLException {\r
+ Source source = state.getConfig().getSource();\r
+ Reference<?> sourceReference = state.getConfig().getSourceReference();\r
+ \r
+ TransactionStatus txStatus = this.startTransaction();\r
+ //TODO\r
+ if (sourceReference.getId() > 0){\r
+ sourceReference = getReferenceService().find(sourceReference.getUuid()); //just to be sure\r
+ } \r
+ TermVocabulary<NamedArea> euroMedAreas = makeEmptyEuroMedVocabulary();\r
+ \r
+ MarkerType eurMarkerType = getMarkerType(state, BerlinModelTransformer.uuidEurArea, "eur", "eur Area", "eur");\r
+ MarkerType euroMedAreaMarkerType = getMarkerType(state, BerlinModelTransformer.uuidEurMedArea, "EuroMedArea", "EuroMedArea", "EuroMedArea");\r
+ ExtensionType isoCodeExtType = getExtensionType(state, BerlinModelTransformer.uuidIsoCode, "IsoCode", "IsoCode", "iso");\r
+ ExtensionType tdwgCodeExtType = getExtensionType(state, BerlinModelTransformer.uuidTdwgAreaCode, "TDWG code", "TDWG Area code", "tdwg");\r
+ ExtensionType mclCodeExtType = getExtensionType(state, BerlinModelTransformer.uuidMclCode, "MCL code", "MedCheckList code", "mcl");\r
+ \r
+ String sql = "SELECT * , CASE WHEN EMCode = 'EM' THEN 'a' ELSE 'b' END as isEM " +\r
+ " FROM emArea " +\r
+ " ORDER BY isEM, EMCode"; \r
+ ResultSet rs = source.getResultSet(sql);\r
+ \r
+ NamedArea euroMedArea = null;\r
+ NamedArea lastLevel2Area = null;\r
+ \r
+ //euroMedArea (EMCode = 'EM')\r
+ rs.next();\r
+ euroMedArea = makeSingleEuroMedArea(rs, eurMarkerType, euroMedAreaMarkerType, isoCodeExtType, tdwgCodeExtType, mclCodeExtType, sourceReference, euroMedArea, lastLevel2Area);\r
+ euroMedAreas.addTerm(euroMedArea);\r
+ \r
+ //all other areas\r
+ while (rs.next()){\r
+ NamedArea newArea = makeSingleEuroMedArea(rs, eurMarkerType, euroMedAreaMarkerType,\r
+ isoCodeExtType, tdwgCodeExtType, mclCodeExtType, sourceReference, euroMedArea, lastLevel2Area);\r
+ euroMedAreas.addTerm(newArea);\r
+ if (newArea.getPartOf().equals(euroMedArea)){\r
+ lastLevel2Area = newArea;\r
+ }\r
+ getVocabularyService().saveOrUpdate(euroMedAreas);\r
+ } \r
+ \r
+ commitTransaction(txStatus);\r
+ return euroMedAreas;\r
+ }\r
+\r
+ /**\r
+ * @param eurMarkerType\r
+ * @param euroMedAreaMarkerType\r
+ * @param isoCodeExtType\r
+ * @param tdwgCodeExtType\r
+ * @param mclCodeExtType\r
+ * @param rs\r
+ * @throws SQLException\r
*/\r
+ private NamedArea makeSingleEuroMedArea(ResultSet rs, MarkerType eurMarkerType,\r
+ MarkerType euroMedAreaMarkerType, ExtensionType isoCodeExtType,\r
+ ExtensionType tdwgCodeExtType, ExtensionType mclCodeExtType,\r
+ Reference<?> sourceReference, NamedArea euroMedArea, NamedArea level2Area) throws SQLException {\r
+ Integer areaId = rs.getInt("AreaId");\r
+ String emCode = nullSafeTrim(rs.getString("EMCode"));\r
+ String isoCode = nullSafeTrim(rs.getString("ISOCode"));\r
+ String tdwgCode = nullSafeTrim(rs.getString("TDWGCode"));\r
+ String unit = nullSafeTrim(rs.getString("Unit"));\r
+// ,[Status]\r
+// ,[OutputOrder]\r
+ boolean eurMarker = rs.getBoolean("eur");\r
+ boolean euroMedAreaMarker = rs.getBoolean("EuroMedArea");\r
+ String notes = nullSafeTrim(rs.getString("Notes"));\r
+ String mclCode = nullSafeTrim(rs.getString("MCLCode"));\r
+ String geoSearch = nullSafeTrim(rs.getString("NameForGeoSearch"));\r
+ \r
+ if (isBlank(emCode)){\r
+ emCode = unit;\r
+ }\r
+ \r
+ //label\r
+ NamedArea area = NamedArea.NewInstance(geoSearch, unit, emCode);\r
+ //code\r
+ area.setIdInVocabulary(emCode);\r
+ //notes\r
+ if (StringUtils.isNotEmpty(notes)){\r
+ area.addAnnotation(Annotation.NewInstance(notes, AnnotationType.EDITORIAL(), Language.DEFAULT()));\r
+ }\r
+ //markers\r
+ area.addMarker(Marker.NewInstance(eurMarkerType, eurMarker));\r
+ area.addMarker(Marker.NewInstance(euroMedAreaMarkerType, euroMedAreaMarker));\r
+ \r
+ //extensions\r
+ if (isNotBlank(isoCode)){\r
+ area.addExtension(isoCode, isoCodeExtType);\r
+ }\r
+ if (isNotBlank(tdwgCode)){\r
+ area.addExtension(tdwgCode, tdwgCodeExtType);\r
+ }\r
+ if (isNotBlank(mclCode)){\r
+ area.addExtension(mclCode, mclCodeExtType);\r
+ }\r
+ \r
+ //source\r
+ area.addSource(OriginalSourceType.Import, String.valueOf(areaId), EM_AREA_NAMESPACE, sourceReference, null);\r
+ \r
+ //parent\r
+ if (euroMedArea != null){\r
+ if (emCode.contains("(")){\r
+ area.setPartOf(level2Area);\r
+ }else{\r
+ area.setPartOf(euroMedArea);\r
+ }\r
+ }\r
+ this.euroMedAreas.put(areaId, area);\r
+ \r
+ //save\r
+ getTermService().saveOrUpdate(area);\r
+ \r
+ return area;\r
+ }\r
+\r
+ private String nullSafeTrim(String string) {\r
+ if (string == null){\r
+ return null;\r
+ }else{\r
+ return string.trim();\r
+ }\r
+ }\r
+\r
+ /**\r
+ * \r
+ */\r
+ private TermVocabulary<NamedArea> makeEmptyEuroMedVocabulary() {\r
+ TermType type = TermType.NamedArea;\r
+ String description = "Euro+Med area vocabulary";\r
+ String label = "E+M areas";\r
+ String abbrev = null;\r
+ URI termSourceUri = null;\r
+ TermVocabulary<NamedArea> result = TermVocabulary.NewInstance(type, description, label, abbrev, termSourceUri);\r
+ getVocabularyService().save(result);\r
+ return result;\r
+ }\r
+\r
@Override\r
public boolean doPartition(ResultSetPartitioner partitioner, BerlinModelImportState state) {\r
boolean success = true;\r
\r
int occurrenceId = rs.getInt("OccurrenceId");\r
int newTaxonId = rs.getInt("taxonId");\r
- String tdwgCodeString = rs.getString("TDWGCode");\r
- String emCodeString = state.getConfig().isIncludesAreaEmCode() ? rs.getString("EMCode") : null;\r
+ \r
Integer emStatusId = nullSafeInt(rs, "emOccurSumCatId");\r
\r
try {\r
alternativeStatusString = CdmUtils.concat(",", stringArray);\r
}\r
\r
- //Create area list\r
- List<NamedArea> areas = new ArrayList<NamedArea>();\r
- if (tdwgCodeString != null){\r
- \r
- String[] tdwgCodes = new String[]{tdwgCodeString};\r
- if (state.getConfig().isSplitTdwgCodes()){\r
- tdwgCodes = tdwgCodeString.split(";");\r
- }\r
- \r
- for (String tdwgCode : tdwgCodes){\r
- NamedArea area = TdwgAreaProvider.getAreaByTdwgAbbreviation(tdwgCode.trim());\r
- if (area == null){\r
- area = getOtherAreas(state, emCodeString, tdwgCodeString);\r
- }\r
- if (area != null){\r
- areas.add(area);\r
- }\r
- }\r
- }\r
- \r
- Reference<?> sourceRef = state.getTransactionalSourceReference();\r
+ Reference<?> sourceRef = state.getTransactionalSourceReference();\r
+ \r
+ List<NamedArea> areas = makeAreaList(state, rs, occurrenceId);\r
+ \r
//create description(elements)\r
TaxonDescription taxonDescription = getTaxonDescription(newTaxonId, oldTaxonId, oldDescription, taxonMap, occurrenceId, sourceRef);\r
- if (areas.size()== 0){\r
- NamedArea area = getOtherAreas(state, emCodeString, tdwgCodeString);\r
- if (area != null){\r
- areas.add(area);\r
- }\r
- }\r
- if (areas.size() == 0){\r
- String areaId = rs.getString("AreaId");\r
- logger.warn("No areas defined for occurrence " + occurrenceId + ". EMCode: " + CdmUtils.Nz(emCodeString).trim() + ". AreaId: " + areaId );\r
- }\r
for (NamedArea area : areas){\r
Distribution distribution = Distribution.NewInstance(area, status);\r
if (status == null){\r
}\r
}\r
\r
-\r
-\r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#getRelatedObjectsForPartition(java.sql.ResultSet)\r
+ /**\r
+ * @param state\r
+ * @param rs\r
+ * @param occurrenceId\r
+ * @param tdwgCodeString\r
+ * @param emCodeString\r
+ * @return\r
+ * @throws SQLException\r
*/\r
+ //Create area list\r
+ private List<NamedArea> makeAreaList(BerlinModelImportState state, ResultSet rs, int occurrenceId) throws SQLException {\r
+ List<NamedArea> areas = new ArrayList<NamedArea>();\r
+ \r
+ if (state.getConfig().isUseEmAreaVocabulary()){\r
+ Integer areaId = rs.getInt("AreaId");\r
+ NamedArea area = this.euroMedAreas.get(areaId);\r
+ areas.add(area);\r
+ }else{\r
+ String tdwgCodeString = rs.getString("TDWGCode");\r
+ String emCodeString = state.getConfig().isIncludesAreaEmCode() ? rs.getString("EMCode") : null;\r
+ \r
+ if (tdwgCodeString != null){\r
+ \r
+ String[] tdwgCodes = new String[]{tdwgCodeString};\r
+ if (state.getConfig().isSplitTdwgCodes()){\r
+ tdwgCodes = tdwgCodeString.split(";");\r
+ }\r
+ \r
+ for (String tdwgCode : tdwgCodes){\r
+ NamedArea area = TdwgAreaProvider.getAreaByTdwgAbbreviation(tdwgCode.trim());\r
+ if (area == null){\r
+ area = getOtherAreas(state, emCodeString, tdwgCodeString);\r
+ }\r
+ if (area != null){\r
+ areas.add(area);\r
+ }\r
+ }\r
+ }\r
+ \r
+ if (areas.size()== 0){\r
+ NamedArea area = getOtherAreas(state, emCodeString, tdwgCodeString);\r
+ if (area != null){\r
+ areas.add(area);\r
+ }\r
+ }\r
+ if (areas.size() == 0){\r
+ String areaId = rs.getString("AreaId");\r
+ logger.warn("No areas defined for occurrence " + occurrenceId + ". EMCode: " + CdmUtils.Nz(emCodeString).trim() + ". AreaId: " + areaId );\r
+ }\r
+ }\r
+ return areas;\r
+ }\r
+\r
+ @Override\r
public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs) {\r
String nameSpace;\r
Class cdmClass;\r
return result;\r
}\r
\r
-\r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IoStateBase)\r
- */\r
@Override\r
protected boolean doCheck(BerlinModelImportState state){\r
IOValidator<BerlinModelImportState> validator = new BerlinModelOccurrenceImportValidator();\r
}\r
\r
\r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)\r
- */\r
+ @Override\r
protected boolean isIgnore(BerlinModelImportState state){\r
if (! state.getConfig().isDoOccurrence()){\r
return true;\r
\r
import java.sql.ResultSet;\r
import java.sql.SQLException;\r
+import java.util.ArrayList;\r
+import java.util.Collection;\r
import java.util.Map;\r
\r
import org.apache.log4j.Logger;\r
import org.springframework.stereotype.Component;\r
\r
+import eu.etaxonomy.cdm.config.Configuration;\r
import eu.etaxonomy.cdm.io.berlinModel.in.validation.BerlinModelUserImportValidator;\r
-import eu.etaxonomy.cdm.io.common.ICdmIO;\r
import eu.etaxonomy.cdm.io.common.IOValidator;\r
import eu.etaxonomy.cdm.io.common.ImportHelper;\r
-import eu.etaxonomy.cdm.io.common.MapWrapper;\r
import eu.etaxonomy.cdm.io.common.ResultSetPartitioner;\r
import eu.etaxonomy.cdm.io.common.Source;\r
import eu.etaxonomy.cdm.model.agent.Person;\r
/**\r
* @author a.mueller\r
* @created 20.03.2008\r
- * @version 1.0\r
*/\r
@Component\r
public class BerlinModelUserImport extends BerlinModelImportBase {\r
super(dbTableName, pluralString);\r
}\r
\r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.cdm.io.common.CdmIoBase#doCheck(eu.etaxonomy.cdm.io.common.IImportConfigurator)\r
- */\r
@Override\r
protected boolean doCheck(BerlinModelImportState state){\r
IOValidator<BerlinModelImportState> validator = new BerlinModelUserImportValidator();\r
return validator.validate(state);\r
}\r
\r
+ @Override\r
protected void doInvoke(BerlinModelImportState state){\r
boolean success = true;\r
- MapWrapper<User> userMap = (MapWrapper<User>)state.getStore(ICdmIO.USER_STORE);\r
\r
BerlinModelImportConfigurator config = state.getConfig();\r
Source source = config.getSource();\r
" SELECT * " +\r
" FROM "+dbTableName+" " ;\r
ResultSet rs = source.getResultSet(strQuery) ;\r
- String namespace = dbTableName;\r
+ Collection<User> users = new ArrayList<User>();\r
\r
int i = 0;\r
//for each reference\r
\r
/* \r
* this is a crucial call, otherwise the password will not be set correctly\r
- * and the whole authenticataion will not work \r
+ * and the whole authentication will not work \r
*/\r
+ authenticate(Configuration.adminLogin, Configuration.adminPassword);\r
getUserService().createUser(user);\r
\r
+ \r
dbAttrName = "RealName";\r
cdmAttrName = "TitleCache";\r
success &= ImportHelper.addStringValue(rs, person, dbAttrName, cdmAttrName, false);\r
\r
- \r
- userMap.put(username, user);\r
+ users.add(user);\r
state.putUser(username, user);\r
}catch(Exception ex){\r
logger.error(ex.getMessage());\r
}\r
\r
logger.info("save " + i + " "+pluralString + " ...");\r
- getUserService().save(userMap.objects());\r
+ getUserService().save(users);\r
\r
logger.info("end make "+pluralString+" ..." + getSuccessString(success));;\r
if (!success){\r
}\r
\r
\r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IImportConfigurator)\r
- */\r
+ @Override\r
protected boolean isIgnore(BerlinModelImportState state){\r
return ! state.getConfig().isDoUser();\r
}\r
\r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getRecordQuery(eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator)\r
- */\r
@Override\r
protected String getRecordQuery(BerlinModelImportConfigurator config) {\r
return null; // not needed at the moment\r
}\r
\r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#doPartition(eu.etaxonomy.cdm.io.berlinModel.in.ResultSetPartitioner, eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState)\r
- */\r
+ @Override\r
public boolean doPartition(ResultSetPartitioner partitioner, BerlinModelImportState state) {\r
return true; // not needed at the moment\r
}\r
\r
- /* (non-Javadoc)\r
- * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#getRelatedObjectsForPartition(java.sql.ResultSet)\r
- */\r
+ @Override\r
public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForPartition(ResultSet rs) {\r
return null; //not needed at the moment\r
}\r