Project

General

Profile

Download (10.2 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2007 EDIT
3
* European Distributed Institute of Taxonomy
4
* http://www.e-taxonomy.eu
5
*
6
* The contents of this file are subject to the Mozilla Public License Version 1.1
7
* See LICENSE.TXT at the top of this package for the full license terms.
8
*/
9

    
10
package eu.etaxonomy.cdm.io.common;
11

    
12
import java.lang.reflect.Constructor;
13
import java.lang.reflect.InvocationTargetException;
14
import java.util.HashSet;
15
import java.util.Set;
16

    
17
import org.apache.commons.lang.StringUtils;
18
import org.apache.log4j.Logger;
19
import org.springframework.transaction.PlatformTransactionManager;
20
import org.springframework.transaction.TransactionDefinition;
21
import org.springframework.transaction.TransactionStatus;
22
import org.springframework.transaction.support.DefaultTransactionDefinition;
23

    
24
import eu.etaxonomy.cdm.api.application.CdmRepository;
25
import eu.etaxonomy.cdm.common.IoResultBase;
26
import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;
27
import eu.etaxonomy.cdm.io.common.events.IIoEvent;
28
import eu.etaxonomy.cdm.io.common.events.IIoObserver;
29
import eu.etaxonomy.cdm.io.common.events.IoProblemEvent;
30
import eu.etaxonomy.cdm.io.common.events.IoProgressEvent;
31
import eu.etaxonomy.cdm.model.common.CdmBase;
32

    
33
/**
34
 * @author a.mueller
35
 * @created 01.07.2008
36
 */
37
public abstract class CdmIoBase<STATE extends IoStateBase, RESULT extends IoResultBase>
38
	    extends CdmRepository
39
        implements ICdmIO<STATE>, IIoObservable {
40

    
41
    private static final long serialVersionUID = -2216451655392574659L;
42
    private static final Logger logger = Logger.getLogger(CdmIoBase.class);
43

    
44
    private final Set<IIoObserver> observers = new HashSet<>();
45
    protected String ioName = null;
46

    
47

    
48
    protected CdmIoBase() {
49
        super();
50
        this.ioName = this.getClass().getSimpleName();
51
    }
52

    
53
//******************** Observers *********************************************************
54

    
55
    @Override
56
    public boolean addObserver(IIoObserver observer){
57
        return observers.add(observer);
58
    }
59

    
60
    @Override
61
    public Set<IIoObserver> getObservers() {
62
        return observers;
63
    }
64

    
65
    @Override
66
    public void addObservers(Set<IIoObserver> newObservers) {
67
        for (IIoObserver observer : newObservers){
68
            this.observers.add(observer);
69
        }
70
    }
71

    
72
    @Override
73
    public int countObservers(){
74
        return observers.size();
75
    }
76

    
77
    @Override
78
    public boolean removeObserver(IIoObserver observer){
79
        return observers.remove(observer);
80
    }
81

    
82
    @Override
83
    public void removeObservers(){
84
        observers.removeAll(observers);
85
    }
86

    
87
    @Override
88
    public void fire(IIoEvent event){
89
        for (IIoObserver observer: observers){
90
            observer.handleEvent(event);
91
        }
92
    }
93

    
94
//******************** End Observers *********************************************************
95

    
96

    
97

    
98
    public void invoke(STATE state) {
99
        if (isIgnore(state)){
100
            logger.info("No invoke for " + ioName + " (ignored)");
101
//            return getNoDataResult(state);
102
        }else{
103
            updateProgress(state, "Invoking " + ioName);
104
            doInvoke(state);
105
        }
106
    }
107

    
108
    protected abstract RESULT getNoDataResult(STATE state);
109
    protected abstract RESULT getDefaultResult(STATE state);
110

    
111

    
112
    @Override
113
    public long countSteps(STATE state){
114
        return 1;
115
    }
116

    
117
//    @Autowired
118
//    private SessionFactory sessionFactory;
119

    
120
//    /**
121
//     * flush the current session
122
//     */
123
//    //TODO move into super class CdmApplicationDefaultConfiguration#flush() ?
124
//    public void flush() {
125
//        sessionFactory.getCurrentSession().flush();
126
//    }
127

    
128
    @Override
129
    //TODO seems to be exact duplicate of CdmApplicationDefaultConfiguration#startTransaction(), remove duplicate
130
    public TransactionStatus startTransaction() {
131
        return startTransaction(false);
132
    }
133

    
134
    @Override
135
    //TODO seems to be exact duplicate of CdmApplicationDefaultConfiguration#startTransaction(java.lang.Boolean)
136
    public TransactionStatus startTransaction(Boolean readOnly) {
137

    
138
        DefaultTransactionDefinition defaultTxDef = new DefaultTransactionDefinition();
139
        defaultTxDef.setReadOnly(readOnly);
140
        TransactionDefinition txDef = defaultTxDef;
141

    
142
        // Log some transaction-related debug information.
143
        if (logger.isDebugEnabled()) {
144
            logger.debug("Transaction name = " + txDef.getName());
145
            logger.debug("Transaction facets:");
146
            logger.debug("Propagation behavior = " + txDef.getPropagationBehavior());
147
            logger.debug("Isolation level = " + txDef.getIsolationLevel());
148
            logger.debug("Timeout = " + txDef.getTimeout());
149
            logger.debug("Read Only = " + txDef.isReadOnly());
150
            // org.springframework.orm.hibernate5.HibernateTransactionManager
151
            // provides more transaction/session-related debug information.
152
        }
153

    
154
        TransactionStatus txStatus = super.getTransactionManager().getTransaction(txDef);
155
        return txStatus;
156
    }
157

    
158
    @Override
159
    //TODO seems to be exact duplicate of CdmApplicationDefaultConfiguration#startTransaction(java.lang.Boolean), remove duplicate?
160
    public void commitTransaction(TransactionStatus txStatus){
161
        PlatformTransactionManager txManager = super.getTransactionManager();
162
        txManager.commit(txStatus);
163
        return;
164
    }
165

    
166
    //TODO move into super class CdmApplicationDefaultConfiguration#startTransaction(java.lang.Boolean)
167
    //==> no
168
    public void rollbackTransaction(TransactionStatus txStatus){
169
        PlatformTransactionManager txManager = super.getTransactionManager();
170
        txManager.rollback(txStatus);
171
        return;
172
    }
173

    
174
    @Override
175
    public boolean check(STATE state) {
176
        if (isIgnore(state)){
177
            logger.info("No check for " + ioName + " (ignored)");
178
            return true;
179
        }else{
180
            return doCheck(state);
181
        }
182
    }
183

    
184
    protected abstract boolean doCheck(STATE state);
185

    
186
    /**
187
     * invoke method to be implemented by implementing classes
188
     * @param state
189
     * @return
190
     */
191
    protected abstract void doInvoke(STATE state);
192

    
193
    /**
194
     * Returns true if this (IO-)class should be ignored during the import/export process.
195
     * This information is usually stored in the configuration
196
     * @param config
197
     * @return
198
     */
199
    protected abstract boolean isIgnore(STATE state);
200

    
201
    protected <T extends CdmBase> T getInstance(Class<? extends T> clazz){
202
        T result = null;
203
        try {
204
            Constructor<? extends T> constructor = clazz.getDeclaredConstructor();
205
            constructor.setAccessible(true);
206
            result = constructor.newInstance();
207
        } catch (InstantiationException e) {
208
            logger.error("Class " + clazz.getSimpleName()+" could not be instantiated. Class = " );
209
            e.printStackTrace();
210
        } catch (IllegalAccessException e) {
211
            logger.error("Constructor of class "+clazz.getSimpleName()+" could not be accessed." );
212
            e.printStackTrace();
213
        } catch (SecurityException e) {
214
            e.printStackTrace();
215
        } catch (NoSuchMethodException e) {
216
            logger.error("SecurityException for Constructor of class "+clazz.getSimpleName()+"." );
217
            e.printStackTrace();
218
        } catch (IllegalArgumentException e) {
219
            logger.error("Empty Constructor does not exist for class "+clazz.getSimpleName()+"." );
220
            e.printStackTrace();
221
        } catch (InvocationTargetException e) {
222
            logger.error("Empty Constructor could not be invoked for class "+clazz.getSimpleName()+"." );
223
            e.printStackTrace();
224
        }
225
        return result;
226
    }
227

    
228

    
229
    protected String getSuccessString(boolean success){
230
        if (success){
231
            return "with success";
232
        }else{
233
            return "with errors";
234
        }
235
    }
236

    
237
    @Override
238
    public void updateProgress(STATE state, String message) {
239
        updateProgress(state, message, 1);
240
    }
241

    
242
    @Override
243
    public void updateProgress(STATE state, String message, int worked) {
244
        if (state.getConfig().getProgressMonitor() == null){
245
            IProgressMonitor progressMonitor = state.getConfig().getProgressMonitor();
246
            if(progressMonitor != null){
247
                progressMonitor.worked(worked);
248
                progressMonitor.subTask(message);
249
            }
250
        }
251
    }
252

    
253
    @Override
254
    public void warnProgress(STATE state, String message, Throwable e) {
255
        if(state.getConfig().getProgressMonitor() != null){
256
            IProgressMonitor monitor = state.getConfig().getProgressMonitor();
257
            if (e == null) {
258
                monitor.warning(message);
259
            }else{
260
                monitor.warning(message, e);
261
            }
262
        }
263
    }
264

    
265
    protected void fireProgressEvent(String message, String location) {
266
        IoProgressEvent event = new IoProgressEvent();
267
        event.setThrowingClass(this.getClass());
268
        event.setMessage(message);
269
        event.setLocation(location);
270
//		int linenumber = new Exception().getStackTrace()[0].getLineNumber();
271
        fire(event);
272
    }
273

    
274

    
275
    protected void fireWarningEvent(String message, String dataLocation, Integer severity) {
276
        fireWarningEvent(message, dataLocation, severity, 1);
277
    }
278

    
279
    protected void fireWarningEvent(String message, String dataLocation, Integer severity, int stackDepth) {
280
        stackDepth++;
281
        StackTraceElement[] stackTrace = new Exception().getStackTrace();
282
        int lineNumber = stackTrace[stackDepth].getLineNumber();
283
        String methodName = stackTrace[stackDepth].getMethodName();
284
        String className = stackTrace[stackDepth].getClassName();
285
		Class<?> declaringClass;
286
		try {
287
			declaringClass = Class.forName(className);
288
		} catch (ClassNotFoundException e) {
289
			declaringClass = this.getClass();
290
		}
291

    
292
        IoProblemEvent event = IoProblemEvent.NewInstance(declaringClass, message, dataLocation,
293
                lineNumber, severity, methodName);
294

    
295
        //for performance improvement one may read:
296
        //http://stackoverflow.com/questions/421280/in-java-how-do-i-find-the-caller-of-a-method-using-stacktrace-or-reflection
297
//		Object o = new SecurityManager().getSecurityContext();
298

    
299

    
300
        fire(event);
301
    }
302

    
303
    protected boolean isBlank(String str){
304
        return StringUtils.isBlank(str);
305
    }
306

    
307
    protected boolean isNotBlank(String str){
308
        return StringUtils.isNotBlank(str);
309
    }
310

    
311
}
(8-8/63)