Révision 561

tmp/org.txm.cah.core/src/org/txm/cah/core/messages/AHCCoreMessages.java (revision 561)
1 1
package org.txm.cah.core.messages;
2 2

  
3
import org.eclipse.osgi.util.NLS;
4 3
import org.txm.utils.messages.Utf8NLS;
5 4

  
6
public class AHCCoreMessages extends NLS {
7

  
8
	private static final String BUNDLE_NAME = "org.txm.cah.core.messages.messages"; //$NON-NLS-1$
9

  
5
public class AHCCoreMessages extends Utf8NLS {
10 6
	
7
	static {
8
		Utf8NLS.initializeMessages(AHCCoreMessages.class);
9
	}
10
	
11 11
	public static String RESULT_TYPE;
12 12
	
13 13
	public static String ERROR_EXPORT_TXT;
14 14
	public static String LOG_COMPUTE_CAH;
15
	
16
	
17
	
18
	static {
19
		// initialize resource bundle
20
		Utf8NLS.initializeMessages(BUNDLE_NAME, AHCCoreMessages.class);
21
	}
22

  
23
	private AHCCoreMessages() {
24
	}
25 15
}
tmp/org.txm.internalview.rcp/src/org/txm/internal/rcp/editors/InternalViewEditor.java (revision 561)
35 35
import org.txm.internalview.rcp.Messages;
36 36
import org.txm.rcp.IImageKeys;
37 37
import org.txm.rcp.editors.TXMEditorPart;
38
import org.txm.rcp.editors.TXMEditorToolBar;
38 39
import org.txm.rcp.editors.TXMResultEditorInput;
39 40
import org.txm.rcp.editors.TableKeyListener;
40 41
import org.txm.rcp.swt.widget.NavigationWidget;
......
105 106
		return false;
106 107
	}
107 108
	
108
	public void updateParameters() {
109
		final StructuralUnit struct = internalView.getAvailableStructs().get(this.structCombo.getSelectionIndex());
110
		final  List<Property> properties = propSelector.getProperties();
111
		final List<StructuralUnitProperty> supList = new ArrayList<StructuralUnitProperty>();
112
		List<StructuralUnitProperty> pList = structSelector.getProperties();
113
		for (Property property : pList) if (property instanceof StructuralUnitProperty) supList.add((StructuralUnitProperty) property);
114
		
115
		Integer currentPage = internalView.getCurrentSegmentNo();
116
		if (currentPage == null) currentPage = 0;
117
		internalView.setParameters(properties, struct, supList, currentPage);
118
	}
119
	
120 109
	@Override
121
	public void refresh(boolean update) {
110
	public void updateEditorFromResult(boolean update) {
122 111
		
123 112
//		JobHandler jobhandler = new JobHandler(Messages.InternalViewEditor_1) {
124 113
//			@Override
......
187 176
	 */
188 177
	@Override
189 178
	public void createPartControl(Composite parent) {
179
		super.createPartControl(parent);
180
		
190 181
		this.setTitleImage(IImageKeys.getImage(AdapterFactory.ACTION_INTERNALVIEW));
191
		parent.setLayout(new GridLayout(1,true));
192

  
193
		formPanel = new Composite(parent, SWT.NONE);
182
		
183
		formPanel = getCommandParametersGroup();
194 184
		formPanel.setLayout(new GridLayout(5,false));
195 185
		formPanel.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false));
196
		navigationPanel = new Composite(parent, SWT.NONE);
186
		
187
		//TXMEditorToolBar navigationPanelToolBar = new TXMEditorToolBar(this.getTopToolBarContainer(), SWT.FLAT | SWT.RIGHT, "top", this);
188
		
189
		navigationPanel = getTopToolbar().installGroup("navigation", "Navigation", null, true);
197 190
		navigationPanel.setLayout(new GridLayout(4,false));
198 191
		navigationPanel.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false));
199
		resultPanel = new Composite(parent, SWT.NONE);
192
		
193
		resultPanel = getResultArea();
200 194
		resultPanel.setLayout(new GridLayout(1,true));
201
		resultPanel.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));
195
		//resultPanel.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));
202 196

  
203 197
		Label structComboLabel = new Label(formPanel, SWT.NONE);
204 198
		structComboLabel.setText(Messages.InternalViewEditor_4);
......
211 205
				internalView.setStructuralUnit(internalView.getAvailableStructs().get(structCombo.getSelectionIndex()));
212 206
				try {
213 207
					internalView.getFirst();
214
					fillResultArea();
208
					compute(true);
215 209
				} catch (CqiClientException e1) {
216 210
					System.out.println("Error: "+e1.getLocalizedMessage());
217 211
					Log.printStackTrace(e1);
......
221 215
			@Override
222 216
			public void widgetDefaultSelected(SelectionEvent e) {}
223 217
		});
224
		propSelector = new PropertiesSelector(formPanel, SWT.NONE);
218
		propSelector = new PropertiesSelector<Property>(formPanel, SWT.NONE);
225 219
		propSelector.setLayoutData(new GridData(GridData.CENTER, GridData.CENTER, false, true));
226 220
		propSelector.setLayout(new GridLayout(3, false));
227 221
		propSelector.addSelectionListener(new SelectionListener() {
228 222
			@Override
229 223
			public void widgetSelected(SelectionEvent e) {
230 224
				internalView.setParameters(propSelector.getProperties(), null, null, null);
231
				try {
232
					fillResultArea();
233
				} catch (CqiClientException e1) {
234
					System.out.println("Error: "+e1.getLocalizedMessage());
235
					Log.printStackTrace(e1);
236
				}
225
				compute(true);
237 226
			}
238 227

  
239 228
			@Override
240 229
			public void widgetDefaultSelected(SelectionEvent e) {}
241 230
		});
242 231

  
243
		structSelector = new PropertiesSelector(formPanel, SWT.NONE);
232
		structSelector = new PropertiesSelector<StructuralUnitProperty>(formPanel, SWT.NONE);
244 233
		structSelector.setLayoutData(new GridData(GridData.CENTER, GridData.CENTER, false, true));
245 234
		structSelector.setLayout(new GridLayout(3, false));
246 235
		structSelector.setText(Messages.InternalViewEditor_5);
......
357 346
						navigation.setNextEnabled(!internalView.isLast());
358 347
						navigation.setLastEnabled(true);
359 348
					} catch (CqiClientException e1) {
360
						// TODO Auto-generated catch block
361 349
						org.txm.rcp.utils.Logger.printStackTrace(e1);
362 350
					}
363 351
				}
......
379 367
						navigation.setNextEnabled(false);
380 368
						navigation.setLastEnabled(false);
381 369
					} catch (CqiClientException e1) {
382
						// TODO Auto-generated catch block
383 370
						org.txm.rcp.utils.Logger.printStackTrace(e1);
384 371
					}
385 372
				}
......
421 408
				}
422 409
				if (inputElement instanceof HashMap<?,?>) {
423 410
					HashMap<Property, List<String>> l = (HashMap<Property, List<String>>) inputElement;
424
					for(int i = 0 ; i < props.size() ; i++) {
411
					for (int i = 0 ; i < props.size() ; i++) {
425 412
						Property prop = props.get(i);
426 413
						List<String> data = l.get(prop);
427 414
						for (int j = 0 ; j < nlines ; j++) {
......
463 450
	}
464 451

  
465 452
	private void reloadStructuralUnitProperties() {
466
		
467 453
		structSelector.setProperties(internalView.getAvailableStructuralUnitProperties(), internalView.getStructuralUnitProperties());
468 454
	}
469 455

  
......
672 658
			org.txm.rcp.utils.Logger.printStackTrace(e);
673 659
		}
674 660
	}
661

  
662
	@Override
663
	public void updateResultFromEditor() {
664
		final StructuralUnit struct = internalView.getAvailableStructs().get(this.structCombo.getSelectionIndex());
665
		final  List<Property> properties = propSelector.getProperties();
666
		final List<StructuralUnitProperty> supList = new ArrayList<StructuralUnitProperty>();
667
		List<StructuralUnitProperty> pList = structSelector.getProperties();
668
		for (Property property : pList) if (property instanceof StructuralUnitProperty) supList.add((StructuralUnitProperty) property);
669
		
670
		Integer currentPage = internalView.getCurrentSegmentNo();
671
		if (currentPage == null) currentPage = 0;
672
		internalView.setParameters(properties, struct, supList, currentPage);
673
	}
675 674
}
tmp/org.txm.annotation.core/src/org/txm/annotation/core/repository/Messages.java (revision 561)
1 1
package org.txm.annotation.core.repository;
2 2

  
3
import org.eclipse.osgi.util.NLS;
3
import org.txm.utils.messages.Utf8NLS;
4 4

  
5
public class Messages extends NLS {
6
	private static final String BUNDLE_NAME = "org.txm.annotation.repository.messages"; //$NON-NLS-1$
5
public class Messages extends Utf8NLS {
7 6
	static {
8
		// initialize resource bundle
9
		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
7
		Utf8NLS.initializeMessages(Messages.class);
10 8
	}
11 9

  
12 10
	private Messages() {
tmp/org.txm.referencer.core/src/org/txm/functions/referencer/Referencer.java (revision 561)
57 57
import java.util.Map;
58 58

  
59 59
import org.txm.core.messages.TXMCoreMessages;
60
import org.txm.core.results.Parameter;
60 61
import org.txm.core.results.TXMParameters;
61 62
import org.txm.core.results.TXMResult;
62 63
import org.txm.searchengine.cqp.AbstractCqiClient;
......
65 66
import org.txm.searchengine.cqp.corpus.CorpusManager;
66 67
import org.txm.searchengine.cqp.corpus.Property;
67 68
import org.txm.searchengine.cqp.corpus.QueryResult;
69
import org.txm.searchengine.cqp.corpus.StructuralUnitProperty;
68 70
import org.txm.searchengine.cqp.corpus.query.Match;
69 71
import org.txm.searchengine.cqp.corpus.query.Query;
70 72
import org.txm.searchengine.cqp.serverException.CqiServerError;
......
95 97
	/** The matches. */
96 98
	List<Match> matches;
97 99
	
100
	/** The positions. */
101
	int[] positions;
102
	
98 103
	/** The nlines. */
99 104
	int nlines;
100 105

  
101
	/** The hierarchic sort. */
106
	/** The hierarchic sort. */
107
	@Parameter
102 108
	private boolean pHierarchicSort;
103
	
104
	/** The positions. */
105
	int[] positions;
109

  
110
	/** The pattern. */
111
	@Parameter
112
	List<StructuralUnitProperty> pPattern;
106 113

  
107
	/** The pattern. */
108
	List<Property> pPattern;
109

  
110
	/** The prop. */
114
	/** The prop. */
115
	@Parameter
111 116
	Property pProperty;
112 117

  
113
	/** The query. */
118
	/** The query. */
119
	@Parameter
114 120
	Query pQuery;
115 121

  
116 122
	/** The processed idx. */
......
136 142
	 */
137 143
	public Referencer(Corpus corpus) {
138 144
		super(corpus);
139
	}

145
	}
140 146

  
141 147
	/**
142 148
	 * As r matrix.
......
160 166
		//rw.eval(symbol+"$query <- \""+this.query.getQueryString()+"\")");
161 167
		rw.eval(symbol+"$refs <- list()"); //$NON-NLS-1$
162 168
		int i = 1;
163
		for(Line line : this.lines)
164
		{
169
		for (Line line : this.lines) {
165 170
			String refs[] = line.getReferences().toArray(new String[line.getReferences().size()]);
166 171
			//System.out.println(line.getPropValue()+": "+Arrays.toString(refs));
167 172
			rw.addVectorToWorkspace("reflinerefs", refs); //$NON-NLS-1$
......
177 182
	@Override
178 183
	public void clean() {
179 184
		try {
180
			this.writer.flush();
181
			this.writer.close();	
185
			if (this.writer != null) {
186
				this.writer.flush();
187
				this.writer.close();	
188
			}
182 189
		} catch (IOException e) {
183 190
			// TODO Auto-generated catch block
184 191
			org.txm.utils.logger.Log.printStackTrace(e);
......
190 197
	 */
191 198
	public void clearAllLines()
192 199
	{
193
		for(Line line : lines)// we need to recompute lines' references
194
		{
200
		for(Line line : lines) { // we need to recompute lines' references
195 201
			line.clear();
196 202
		}
197 203
	}
......
230 236
	}
231 237

  
232 238
	/**
233
	 * Gets the corpus.
239
	 * Gets the parent corpus.
234 240
	 *
235 241
	 * @return the corpus
236 242
	 */
......
345 351
	 *
346 352
	 * @return the pattern
347 353
	 */
348
	public List<Property> getPattern() {
354
	public List<StructuralUnitProperty> getPattern() {
349 355
		return pPattern;
350 356
	}
351 357

  
......
452 458
		return true;
453 459
	}
454 460

  
455
	public void setParameters(Query query, Property prop, List<Property> pattern, Boolean hierarchicSort) {
461
	public void setParameters(Query query, Property prop, List<StructuralUnitProperty> pattern, Boolean hierarchicSort) {
456 462
		if (query != null) this.pQuery = query;
457 463
		if (pattern != null) this.pPattern = pattern;
458 464
		if (prop != null) this.pProperty = prop;
......
530 536

  
531 537
	@Override
532 538
	public boolean canCompute() {
533
		return getCorpus() != null;
539
		return getCorpus() != null 
540
				&& pQuery != null 
541
				&& !pQuery.isEmpty();
534 542
	}
535 543

  
536
	
537 544
	@Override
538
	public boolean saveParameters() {
539
		// TODO Auto-generated method stub
540
		System.err.println("Referencer.saveParameters(): not yet implemented.");
545
	public boolean loadParameters() throws CqiClientException {
546
		this.pQuery = new Query(this.getStringParameterValue(ReferencerPreferences.QUERY));
547
		String s = this.getStringParameterValue(ReferencerPreferences.PATTERN);
548
		this.pPattern = StructuralUnitProperty.fromStringToList(getCorpus(), s);
549
		
550
		s = this.getStringParameterValue(ReferencerPreferences.PROPERTY);
551
		this.pProperty = getCorpus().getProperty(s);
552
		
553
		this.pHierarchicSort = this.getBooleanParameterValue(ReferencerPreferences.SORTBYFREQ);
541 554
		return true;
542 555
	}
543 556

  
544
	
545
	@Override
546
	public boolean loadParameters() {
547
		// TODO Auto-generated method stub
548
		System.err.println("Referencer.loadParameters(): not yet implemented.");
549
		return true;
550
	}
551 557

  
552
	
553 558
	/**
554 559
	 * The Class Line.
555 560
	 */
......
679 684
		public String toString() {
680 685
			return linepropvalue+" : <"+id+","+pProperty+"> : "+references.toString(); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
681 686
		}
687
	}
688

  
689
	public void setQuery(Query query) {
690
		this.pQuery = query;
691
	}
692

  
693
	public void setProperty(Property property) {
694
		this.pProperty = property;
695
	}
696

  
697
	public void setPattern(List<StructuralUnitProperty> properties) {
698
		this.pPattern = properties;
682 699
	}
683 700
}
tmp/org.txm.referencer.core/src/org/txm/functions/referencer/ReferencerPreferences.java (revision 561)
11 11

  
12 12
	/** The Constant SORTBYFREQ. */
13 13
	//FIXME: to extract to referencer plug-in
14
	public static final String SORTBYFREQ = "referencer_sorttype"; //$NON-NLS-1$
14
	public static final String SORTBYFREQ = "sorttype"; //$NON-NLS-1$
15 15

  
16

  
17
	public static final String QUERY = "query";
18
	public static final String PROPERTY = "property";
19
	public static final String PATTERN = "pattern";
20

  
16 21
	@Override
17 22
	public void initializeDefaultPreferences() {
18 23
		Preferences preferences = DefaultScope.INSTANCE.getNode(PREFERENCES_NODE);
19 24

  
20 25
		preferences.putBoolean(SORTBYFREQ, false); //$NON-NLS-1$
21 26

  
27
		preferences.put(QUERY, ""); //$NON-NLS-1$
28
		preferences.put(PROPERTY, "word"); //$NON-NLS-1$
29
		preferences.put(PATTERN, "text_id"); //$NON-NLS-1$
22 30
	}
23 31
}
tmp/org.txm.wordcloud.core/src/org/txm/wordcloud/core/functions/WordCloud.java (revision 561)
1 1
package org.txm.wordcloud.core.functions;
2 2

  
3 3
import java.io.File;
4
import java.util.ArrayList;
5 4
import java.util.List;
6 5

  
7 6
import org.txm.chartsengine.core.results.ChartResult;
......
9 8
import org.txm.core.results.TXMParameters;
10 9
import org.txm.index.core.functions.Index;
11 10
import org.txm.index.core.functions.Line;
12
import org.txm.searchengine.cqp.corpus.Corpus;
13
import org.txm.searchengine.cqp.corpus.Property;
14
import org.txm.searchengine.cqp.corpus.query.Query;
15 11
import org.txm.statsengine.r.core.RWorkspace;
16 12
import org.txm.utils.logger.Log;
17 13
import org.txm.wordcloud.core.messages.WordCloudCoreMessages;
18 14
import org.txm.wordcloud.core.preferences.WordCloudPreferences;
19 15

  
20 16
/**
21
 * Word cloud.
17
 * WordCloud computes word clouds using the "wordcloud" R package and an Index result
22 18
 * 
23 19
 * @author mdecorde
24 20
 * @author sjacquot
......
29 25
	//TODO: test rw.setStringEncoding("UTF-8"); // or connection
30 26
	private int[] freqs;
31 27
	private String[] labels;
32
	private Object source;
28
	
29
	protected Integer pFMinFilter;
30
	
31
	protected Integer pVMaxFilter;
33 32
		
34
//	public WordCloud(LexicalTable table) throws RWorkspaceException, REXPMismatchException {
35
//		parent = table.getPartition();
36
//		if (parent == null) parent = table.getCorpus();
37
//		
38
//		RWorkspace rw = RWorkspace.getRWorkspaceInstance();
39
//		this.labels = rw.evalToString("rownames("+table.getSymbol()+")");
40
//		this.freqs = rw.eval("rowSums("+table.getSymbol()+")").asIntegers();
41
//		
42
//		removeDiacritics();
43
//	}
44

  
45 33
	/**
46 34
	 * 
47 35
	 * @param index
48 36
	 */
49 37
	public WordCloud(Index index) {
50 38
		super(index);
51
		this.source = index;
52
		//removeDiacritics();
53 39
	}
54 40
		
55 41
	/**
......
57 43
	 * @param index
58 44
	 */
59 45
	private void initWith(Index index) {
60
		source = index;
61 46
		List<Line> lines = index.getAllLines();
62 47
		this.freqs = new int[lines.size()];
63 48
		this.labels = new String[lines.size()];
......
69 54
			i++;
70 55
		}
71 56
	}
72
	
73 57

  
74
//	public WordCloud(QueryIndex qindex) {
75
//		parent = qindex.getCorpus();
76
//		source = qindex;
77
//		Collection<QueryIndexLine> lines = qindex.getLines();
78
//		this.freqs = new int[lines.size()];
79
//		this.labels = new String[lines.size()];
80
//		
81
//		int i = 0;
82
//		for (QueryIndexLine line : lines) {
83
//			freqs[i] = line.getFrequency();
84
//			labels[i] = line.getName();
85
//		}
86
//		//removeDiacritics();
87
//	}
88
	
89
	
90
	
91 58
	private void removeDiacritics() {
92 59
		//for (int i = 0; i < labels.length ; i++)
93 60
		//	labels[i] = AsciiUtils.convertNonAscii(labels[i]);
......
186 153
	
187 154
	@Override
188 155
	public String getSimpleName() {
189
		return WordCloudCoreMessages.RESULT_TYPE + " (" + this.getIntParameterValue(WordCloudPreferences.FMIN)
156
		return WordCloudCoreMessages.RESULT_TYPE + " (" + this.pFMinFilter
190 157
				+ " / "
191
				+ this.getIntParameterValue(WordCloudPreferences.MAX_WORDS)
158
				+ this.pVMaxFilter
192 159
				+ ")";
193 160
	}
194 161

  
......
200 167
	
201 168
	@Override
202 169
	public boolean canCompute() {
203
		return source != null;
170
		return parent != null && pFMinFilter != null;
204 171
	}
205 172

  
206 173
	@Override
207
	public boolean saveParameters() {
208
		// TODO Auto-generated method stub
209
		System.err.println("WordCloud.saveParameters(): not yet implemented.");
210
		return true;
211
	}
212

  
213
	@Override
214 174
	public boolean setParameters(TXMParameters parameters) {
215
		// TODO Auto-generated method stub
216
		System.err.println("WordCloud.setParameters(): not yet implemented.");
175
		
176
		if (parameters.containsKey(WordCloudPreferences.FMIN)) {
177
			Object value = parameters.get(WordCloudPreferences.FMIN);
178
			if (value instanceof String) {
179
				this.pFMinFilter = Integer.parseInt(value.toString());
180
			} else if (value instanceof Integer) {
181
				this.pFMinFilter = (Integer)value;
182
			}
183
		}
184
		
185
		if (parameters.containsKey(WordCloudPreferences.MAX_WORDS)) {
186
			Object value = parameters.get(WordCloudPreferences.MAX_WORDS);
187
			if (value instanceof String) {
188
				this.pVMaxFilter = Integer.parseInt(value.toString());
189
			} else if (value instanceof Integer) {
190
				this.pVMaxFilter = (Integer)value;
191
			}
192
		}
193
		
217 194
		return true;
218 195
	}
219 196

  
......
237 214
	
238 215
	@Override
239 216
	protected boolean _compute(boolean update) {
240
		// FIXME: source must always be an Index because the corpus source produces an Index
241
		// from corpus
242
		if (source instanceof Corpus)	{ 
243
			try {
244
				Corpus corpus = (Corpus) source;
245
				Query query;
246
				String lang = corpus.getLang();
247
				if (corpus.getProperty(lang + "pos") != null) {
248
					query = new Query(getQueryForLang(lang));
249
				}
250
				else {
251
					query = new Query("[]");
252
				}
253
				
254
				System.out.println("Used query: " + query);
255
				
256
				ArrayList<Property> props = new ArrayList<Property>();
257
				props.add(corpus.getWordProperty());
258
				Index index = new Index(corpus);
259
				index.setParameters(query, props, null, null, null, null);
260
				if (!query.toString().equals("[]")) {
261
					corpus.addChild(index);
262
				}
263

  
264
				index.compute(false, monitor);
265
				
266
				index.addChild(this);
267
					
268
				List<Line> lines = index.getAllLines();
269
				if (lines != null && lines.size() > 0) {
270
					this.initWith(index);
271
				}
272
				else {
273
					Log.severe("Error: Could not build a word selection with this corpus");
274
					throw new IllegalArgumentException("Error: Index failed with corpus " + corpus + " with lang " + lang + " and query " + query);
275
				}
276
			}
277
			catch(Exception e) {
278
				System.out.println("Error: "+e.getLocalizedMessage());
279
				Log.printStackTrace(e);
280
				return false;
281
			}
282
		}
283
		// from index
284
		else if(this.source instanceof Index)	{
285
			this.initWith((Index) this.source);
286
			return true;
287
		}
288
		
217
//		// FIXME: source must always be an Index because the corpus source produces an Index
218
//		// from corpus
219
//		if (source instanceof Corpus)	{ 
220
//			try {
221
//				Corpus corpus = (Corpus) source;
222
//				Query query;
223
//				String lang = corpus.getLang();
224
//				if (corpus.getProperty(lang + "pos") != null) {
225
//					query = new Query(getQueryForLang(lang));
226
//				}
227
//				else {
228
//					query = new Query("[]");
229
//				}
230
//				
231
//				System.out.println("Used query: " + query);
232
//				
233
//				ArrayList<Property> props = new ArrayList<Property>();
234
//				props.add(corpus.getWordProperty());
235
//				Index index = new Index(corpus);
236
//				index.setParameters(query, props, null, null, null, null);
237
//				if (!query.toString().equals("[]")) {
238
//					corpus.addChild(index);
239
//				}
240
//
241
//				index.compute(false, monitor);
242
//				
243
//				index.addChild(this);
244
//					
245
//				List<Line> lines = index.getAllLines();
246
//				if (lines != null && lines.size() > 0) {
247
//					this.initWith(index);
248
//				}
249
//				else {
250
//					Log.severe("Error: Could not build a word selection with this corpus");
251
//					throw new IllegalArgumentException("Error: Index failed with corpus " + corpus + " with lang " + lang + " and query " + query);
252
//				}
253
//			}
254
//			catch(Exception e) {
255
//				System.out.println("Error: "+e.getLocalizedMessage());
256
//				Log.printStackTrace(e);
257
//				return false;
258
//			}
259
			this.initWith((Index)parent);
260
//		}
261
//		// from index
262
//		else if(this.source instanceof Index)	{
263
//			this.initWith((Index) this.source);
264
//			return true;
265
//		}
266
//		
289 267
		return true;
290 268
	}
291 269

  
270
	@Override
271
	public boolean loadParameters() throws Exception {
272
		this.pFMinFilter = this.getIntParameterValue(WordCloudPreferences.FMIN);
273
		this.pVMaxFilter = this.getIntParameterValue(WordCloudPreferences.MAX_WORDS);
274
		return false;
275
	}
292 276

  
277
	public Integer getFMinFilter() {
278
		return pFMinFilter;
279
	}
280

  
281
	public Integer getVMaxFilter() {
282
		return pVMaxFilter;
283
	}
293 284
}
tmp/org.txm.internalview.core/src/org/txm/internalview/core/Messages.java (revision 561)
1 1
package org.txm.internalview.core;
2 2

  
3
import org.eclipse.osgi.util.NLS;
3
import org.txm.utils.messages.Utf8NLS;
4 4

  
5
public class Messages extends NLS {
5
public class Messages extends Utf8NLS {
6
	
6 7
	public static String InternalView_3;
7 8
	public static String InternalView_6;
8 9
	public static String InternalView_7;
10
	
11
	static {
12
		Utf8NLS.initializeMessages(Messages.class);
13
	}
9 14
}
tmp/org.txm.internalview.core/src/org/txm/functions/internal/InternalView.java (revision 561)
9 9
import java.util.List;
10 10

  
11 11
import org.apache.commons.lang.StringUtils;
12
import org.txm.core.results.Parameter;
12 13
import org.txm.core.results.TXMParameters;
13 14
import org.txm.core.results.TXMResult;
14 15
import org.txm.internalview.core.Messages;
......
19 20
import org.txm.searchengine.cqp.corpus.QueryResult;
20 21
import org.txm.searchengine.cqp.corpus.StructuralUnit;
21 22
import org.txm.searchengine.cqp.corpus.StructuralUnitProperty;
23
import org.txm.searchengine.cqp.corpus.WordProperty;
22 24
import org.txm.searchengine.cqp.corpus.query.Match;
23 25
import org.txm.searchengine.cqp.corpus.query.Query;
24 26
import org.txm.utils.io.IOUtils;
......
32 34
	protected List<Match> matches = new ArrayList<Match>();
33 35
	protected int nmatches = 0;
34 36

  
37
	@Parameter
35 38
	protected Integer pCurrentPage = -1;
39
	@Parameter
36 40
	protected List<Property> pProperties;
37
	
41
	@Parameter
38 42
	protected List<StructuralUnitProperty> pStructProperties;
43
	@Parameter
39 44
	protected StructuralUnit pStructure;
40 45

  
41 46
	public InternalView(Corpus corpus) {
......
44 49
		
45 50
		try {
46 51
			String propNames = this.getStringParameterValue(InternalViewPreferences.PROPERTIES);
47
			pProperties = Property.stringToProperties(corpus, propNames);
52
			pProperties = WordProperty.fromStringToList(corpus, propNames);
48 53
			availablesProperties = new ArrayList<Property>(corpus.getOrderedProperties());
49 54
			availablesProperties.removeAll(pProperties);
50 55
			
51
			propNames = this.getStringParameterValue(InternalViewPreferences.STRUCTURALUNITS);
52 56
			availableStructs = corpus.getStructuralUnits();
53
			pStructure = StructuralUnit.stringToStructuralUnits(corpus, propNames).get(0);
54
			availableStructs.remove(pStructure);
57
			propNames = this.getStringParameterValue(InternalViewPreferences.STRUCTURALUNIT);
58
			List<StructuralUnit> structs = StructuralUnit.stringToStructuralUnits(corpus, propNames);
59
			pStructure = structs.get(0);
60
			//availableStructs.remove(pStructure);
55 61
			
56 62
			propNames = this.getStringParameterValue(InternalViewPreferences.STRUCTURALUNITPROPERTIES);
57 63
			availableStructuralUnitProperties = pStructure.getProperties();
......
88 94
				pStructProperties != null && 
89 95
				pStructProperties.size() > 0;
90 96
	}
91

  
92 97
	
93 98
	@Override
94 99
	public boolean saveParameters() {
95
		// TODO Auto-generated method stub
96
		System.err.println("InternalView.saveParameters(): not yet implemented.");
100
		
101
		if (pCurrentPage != null) this.setParameterValue(InternalViewPreferences.CURRENTPAGE, pCurrentPage);
102
		if (pStructure != null) this.setParameterValue(InternalViewPreferences.STRUCTURALUNIT, pStructure.getName());
103
		if (pStructProperties != null) this.setParameterValue(InternalViewPreferences.STRUCTURALUNITPROPERTIES, StringUtils.join(pStructProperties, "\t"));
104
		if (pProperties != null) this.setParameterValue(InternalViewPreferences.PROPERTIES, StringUtils.join(pProperties, "\t"));
105
		
97 106
		return true;
98 107
	}
99

  
100 108
	
101 109
	@Override
102 110
	public void clean() {
......
268 276

  
269 277
	
270 278
	@Override
271
	public boolean loadParameters() {
272
		// TODO Auto-generated method stub
273
		System.err.println("InternalView.loadParameters(): not yet implemented.");
279
	public boolean loadParameters() throws Exception {
280

  
281
		this.pCurrentPage = this.getIntParameterValue(InternalViewPreferences.CURRENTPAGE);
282
		
283
		String s = this.getStringParameterValue(InternalViewPreferences.STRUCTURALUNIT);
284
		if (s != null && s.length() > 0)
285
			this.pStructure = corpus.getStructuralUnit(s);
286
		
287
		s = this.getStringParameterValue(InternalViewPreferences.STRUCTURALUNITPROPERTIES);
288
		this.pStructProperties = StructuralUnitProperty.fromStringToList(corpus, s);
289
		
290
		s = this.getStringParameterValue(InternalViewPreferences.PROPERTIES);
291
		this.pProperties = WordProperty.fromStringToList(corpus, s);
292
		
274 293
		return true;
275 294
	}
276 295

  
tmp/org.txm.internalview.core/src/org/txm/functions/internal/InternalViewPreferences.java (revision 561)
12 12
	/** the selected word properties */
13 13
	public static final String PROPERTIES = "properties";
14 14
	/** the selected structural units */
15
	public static final String STRUCTURALUNITS = "structuralunits";
15
	public static final String STRUCTURALUNIT = "structuralunit";
16 16
	/** the selected structure properties */
17 17
	public static final String STRUCTURALUNITPROPERTIES = "structuralunitsproperties";
18 18
	/** the current page number */
......
23 23
		Preferences preferences = DefaultScope.INSTANCE.getNode(PREFERENCES_NODE);
24 24
		
25 25
		preferences.put(PROPERTIES, "word");
26
		preferences.put(STRUCTURALUNITS, "text");
26
		preferences.put(STRUCTURALUNIT, "text");
27
		preferences.put(STRUCTURALUNITPROPERTIES, "text_id");
27 28
		preferences.putInt(CURRENTPAGE, 0);
28 29
	}
29 30
}
tmp/org.txm.ca.rcp/src/org/txm/ca/rcp/messages/CAUIMessages.java (revision 561)
3 3
import org.eclipse.osgi.util.NLS;
4 4
import org.txm.utils.messages.Utf8NLS;
5 5

  
6
public class CAUIMessages extends NLS {
7

  
8
	private static final String BUNDLE_NAME = "org.txm.ca.rcp.messages.messages"; //$NON-NLS-1$
9

  
6
public class CAUIMessages extends Utf8NLS {
7
	
8
	static {
9
		Utf8NLS.initializeMessages(CAUIMessages.class);
10
	}
11
	
10 12
	public static String PreferencePage_0;
11 13
	public static String PreferencePage_1;
12 14
	public static String PreferencePage_2;
......
48 50
	public static String CorrespondanceAnalysisEditorInput_9;
49 51
	
50 52
	public static String PreferencePage_CHART_SHOW_POINT_SHAPES;
51
	
52
	
53
	static {
54
		// initializes resource bundle
55
		Utf8NLS.initializeMessages(BUNDLE_NAME, CAUIMessages.class);
56
	}
57

  
58
	private CAUIMessages() {
59
		//no instantiation
60
	}
61 53
}
tmp/org.txm.core/.classpath (revision 561)
32 32
		<attributes>
33 33
			<attribute name="org.eclipse.jdt.launching.CLASSPATH_ATTR_LIBRARY_PATH_ENTRY" value="org.txm.toolbox/native"/>
34 34
		</attributes>
35
		<accessrules>
36
			<accessrule kind="accessible" pattern="**"/>
37
		</accessrules>
35 38
	</classpathentry>
36 39
	<classpathentry kind="src" path="src/java"/>
37 40
	<classpathentry kind="src" path="test"/>
tmp/org.txm.core/src/java/org/txm/core/preferences/TXMPreferences.java (revision 561)
13 13
import java.util.Iterator;
14 14
import java.util.Set;
15 15

  
16
import org.eclipse.core.internal.preferences.Base64;
17 16
import org.eclipse.core.runtime.Platform;
18 17
import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
19 18
import org.eclipse.core.runtime.preferences.DefaultScope;
......
71 70
		scope.getNode(node).remove(key);
72 71
	}
73 72

  
73
	/**
74
	 * Looks for the value of the specified <code>key</code> in the specified parameters and preference nodes.
75
	 * Returns the value of a key in the specified parameters if exists.
76
	 * Otherwise try to get it from the local result node if exists.
77
	 * Otherwise try to get it from the specified node qualifier if exists.
78
	 * Otherwise try to get it from the specified alternative node qualifiers defined in the list <code>TXMPreferences.alternativeNodesQualifiers</code>.
79
	 * Returns <code>false</code> if no value has been found for the specified key.
80
	 * @param commandParameters
81
	 * @param nodeQualifier
82
	 * @param result
83
	 * @param key
84
	 * @return
85
	 */
86
	public static Serializable getSerializable(String key, TXMParameters commandParameters, TXMResult result, String nodeQualifier)	{
87
		if(commandParameters != null && commandParameters.get(key) != null)	{
88
			return (Serializable) commandParameters.get(key);
89
		}
90
		return getSerializable(key, result, nodeQualifier);
91
	}
74 92

  
93

  
94
	public static Serializable getSerializable(String key, TXMParameters commandParameters, TXMResult result)	{
95
		return getSerializable(key, commandParameters, result, result.getPreferencesNodeQualifier());
96
	}
97

  
75 98
	/**
99
	 * Looks for the value of the specified <code>key</code> in preference nodes.
100
	 * Returns the value of the local result node if exists.
101
	 * Otherwise try to get it from the specified node qualifier if exists.
102
	 * Otherwise try to get it from the specified alternative node qualifiers defined in the list <code>TXMPreferences.alternativeNodesQualifiers</code>.
103
	 * Returns defaultValue if no value has been found for the specified key.
104
	 * @param nodeQualifier
105
	 * @param result
106
	 * @param key
107
	 * @return
108
	 */
109
	public static Serializable getSerializable(String key, TXMResult result, String nodeQualifier, Serializable defaultValue)	{
110

  
111
		nodeQualifier = findNodeQualifier(nodeQualifier, result, key);
112

  
113
		String data_default = DefaultScope.INSTANCE.getNode(nodeQualifier).get(key, "");
114
		if (data_default.length() == 0) {
115
			return null;
116
		}
117
		
118
		try {
119
			defaultValue = fromString(data_default);
120
		} catch (Exception e) {
121
			Log.printStackTrace(e);
122
		}
123

  
124
		String data_return = scope.getNode(nodeQualifier).get(key, "");
125
		if (data_return.length() == 0) {
126
			return defaultValue;
127
		}
128

  
129
		try {
130
			return fromString(data_return);
131
		} catch (Exception e) {
132
			Log.printStackTrace(e);
133
		}
134
		return null;
135
	}
136

  
137
	/**
138
	 * Looks for the value of the specified <code>key</code> in preference nodes.
139
	 * Returns the value of the local result node if exists.
140
	 * Otherwise try to get it from the specified node qualifier if exists.
141
	 * Otherwise try to get it from the specified alternative node qualifiers defined in the list <code>TXMPreferences.alternativeNodesQualifiers</code>.
142
	 * Returns <code>false</code> if no value has been found for the specified key.
143
	 * @param nodeQualifier
144
	 * @param result
145
	 * @param key
146
	 * @return
147
	 */
148
	public static Serializable getSerializable(String key, TXMResult result, String nodeQualifier)	{
149
		return getSerializable(key, result, nodeQualifier, false);
150
	}
151

  
152
	/**
153
	 *
154
	 * @param nodeQualifier
155
	 * @param key
156
	 * @return
157
	 */
158
	public static Serializable getSerializable(String key, String nodeQualifier)	{
159
		return getSerializable(key, null, nodeQualifier);
160
	}
161

  
162
	/**
163
	 *
164
	 * @param result
165
	 * @param key
166
	 * @return
167
	 */
168
	public static Serializable getSerializable(String key, TXMResult result)	{
169
		return getSerializable(key, result, null);
170
	}
171

  
172
	/**
76 173
	 * Looks for the value of the specified <code>key</code> in the specified parameters and preference nodes.
77 174
	 * Returns the value of a key in the specified parameters if exists.
78 175
	 * Otherwise try to get it from the local result node if exists.
......
765 862
			e.printStackTrace();
766 863
		}
767 864
	}
768
	
865

  
769 866
	/**
770 867
	 * Dumps the keys and values of the specified node.
771 868
	 * @param nodeQualifier
......
858 955
		if(keyExists)	{
859 956
			nodeQualifier = result.getUUID();
860 957
		}
861
		
958

  
862 959
		// look in the global alternative preferences nodes
863 960
		else if(!keyExists(nodeQualifier, key))	{
864 961
			for(int i = 0; i < alternativeNodesQualifiers.size(); i++) {
......
926 1023
		else if (Boolean.class.isInstance(value))	{
927 1024
			scope.getNode(nodeQualifier).putBoolean(key, (Boolean) value);
928 1025
		}
1026
		else if (Serializable.class.isInstance(value))	{
1027
			try {
1028
				scope.getNode(nodeQualifier).put(key, toString((Serializable)value));
1029
			} catch (IOException e) {
1030
				// TODO Auto-generated catch block
1031
				e.printStackTrace();
1032
			}
1033
		}
1034
		// FIXME: to do
929 1035
		// FIXME: need to prove/validate this methode
930 1036
		else if (byte.class.isAssignableFrom(value.getClass().getComponentType()))	{
931 1037
			System.err.println("TXMPreferences.put(): byte array -> need to prove/validate this method.");
932 1038
			scope.getNode(nodeQualifier).putByteArray(key, (byte[]) value);
933 1039
		}
934

  
1040
		else {
935 1041
		// FIXME: to do if needed
936
		//		else if (Serializable.class.isInstance(value))	{
937
		//			putLocalSerializable(result, key, (Serializable) value);
938
		else {
939 1042
			//FIXME: Debug
940
			System.err.println("TXMPreferences.put(): error, can't find a put method that matches the value type: " + value.getClass() + "=" + value + ".");
1043
			System.err.println("TXMPreferences.putLocal(): error, can't find a put method that matches the value type: " + value.getClass() + "=" + value + ".");
941 1044
		}
942
		
943
		
944 1045
	}
1046

  
1047
	/** Read the object from Base64 string. */
1048
	private static Serializable fromString( String s ) throws IOException ,
1049
	ClassNotFoundException {
1050

  
1051
		byte [] data = Base64.getDecoder().decode( s );
1052
		ObjectInputStream ois = new ObjectInputStream( 
1053
				new ByteArrayInputStream(  data ) );
1054
		Object o  = ois.readObject();
1055
		ois.close();
1056
		return (Serializable)o;
1057
	}
1058

  
1059
	/** Write the object to a Base64 string. */
1060
	private static String toString( Serializable o ) throws IOException {
1061
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
1062
		ObjectOutputStream oos = new ObjectOutputStream( baos );
1063
		oos.writeObject( o );
1064
		oos.close();
1065
		return Base64.getEncoder().encodeToString(baos.toByteArray());		
1066
	}
945 1067
	
946 1068
//
947 1069
//	/**
......
1007 1129
			}
1008 1130
		}
1009 1131
	}
1010
	
1132

  
1011 1133
	//FIXME: this code is dedicated to dynamically retrieve the static field PREFERENCES_NODE of the runtime subclass and use it super class to avoid to pass it to all methods.
1012 1134
	// eg. to use ProgressionPreferences.getBoolean("test") instead of TXMPreferences.getBoolean(ProgressionPreferences.PREFERENCES_NODE, "test")
1013 1135
	// but it doesn"t work, need to continue the tests...
tmp/org.txm.core/src/java/org/txm/core/preferences/Base64.java (revision 561)
1
/*
2
 * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
 *
5
 * This code is free software; you can redistribute it and/or modify it
6
 * under the terms of the GNU General Public License version 2 only, as
7
 * published by the Free Software Foundation.  Oracle designates this
8
 * particular file as subject to the "Classpath" exception as provided
9
 * by Oracle in the LICENSE file that accompanied this code.
10
 *
11
 * This code is distributed in the hope that it will be useful, but WITHOUT
12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14
 * version 2 for more details (a copy is included in the LICENSE file that
15
 * accompanied this code).
16
 *
17
 * You should have received a copy of the GNU General Public License version
18
 * 2 along with this work; if not, write to the Free Software Foundation,
19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20
 *
21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22
 * or visit www.oracle.com if you need additional information or have any
23
 * questions.
24
 */
25

  
26
package org.txm.core.preferences;
27

  
28
import java.io.FilterOutputStream;
29
import java.io.IOException;
30
import java.io.InputStream;
31
import java.io.OutputStream;
32
import java.nio.ByteBuffer;
33
import java.nio.charset.StandardCharsets;
34
import java.util.Arrays;
35
import java.util.Objects;
36

  
37
/**
38
 * This class consists exclusively of static methods for obtaining
39
 * encoders and decoders for the Base64 encoding scheme. The
40
 * implementation of this class supports the following types of Base64
41
 * as specified in
42
 * <a href="http://www.ietf.org/rfc/rfc4648.txt">RFC 4648</a> and
43
 * <a href="http://www.ietf.org/rfc/rfc2045.txt">RFC 2045</a>.
44
 *
45
 * <ul>
46
 * <li><a name="basic"><b>Basic</b></a>
47
 * <p> Uses "The Base64 Alphabet" as specified in Table 1 of
48
 *     RFC 4648 and RFC 2045 for encoding and decoding operation.
49
 *     The encoder does not add any line feed (line separator)
50
 *     character. The decoder rejects data that contains characters
51
 *     outside the base64 alphabet.</p></li>
52
 *
53
 * <li><a name="url"><b>URL and Filename safe</b></a>
54
 * <p> Uses the "URL and Filename safe Base64 Alphabet" as specified
55
 *     in Table 2 of RFC 4648 for encoding and decoding. The
56
 *     encoder does not add any line feed (line separator) character.
57
 *     The decoder rejects data that contains characters outside the
58
 *     base64 alphabet.</p></li>
59
 *
60
 * <li><a name="mime"><b>MIME</b></a>
61
 * <p> Uses the "The Base64 Alphabet" as specified in Table 1 of
62
 *     RFC 2045 for encoding and decoding operation. The encoded output
63
 *     must be represented in lines of no more than 76 characters each
64
 *     and uses a carriage return {@code '\r'} followed immediately by
65
 *     a linefeed {@code '\n'} as the line separator. No line separator
66
 *     is added to the end of the encoded output. All line separators
67
 *     or other characters not found in the base64 alphabet table are
68
 *     ignored in decoding operation.</p></li>
69
 * </ul>
70
 *
71
 * <p> Unless otherwise noted, passing a {@code null} argument to a
72
 * method of this class will cause a {@link java.lang.NullPointerException
73
 * NullPointerException} to be thrown.
74
 *
75
 * @author  Xueming Shen
76
 * @since   1.8
77
 */
78
//TODO: switch to Java 1.8 and drop this copy of java.util.Base64
79
public class Base64 {
80

  
81
    private Base64() {}
82

  
83
    /**
84
     * Returns a {@link Encoder} that encodes using the
85
     * <a href="#basic">Basic</a> type base64 encoding scheme.
86
     *
87
     * @return  A Base64 encoder.
88
     */
89
    public static Encoder getEncoder() {
90
         return Encoder.RFC4648;
91
    }
92

  
93
    /**
94
     * Returns a {@link Encoder} that encodes using the
95
     * <a href="#url">URL and Filename safe</a> type base64
96
     * encoding scheme.
97
     *
98
     * @return  A Base64 encoder.
99
     */
100
    public static Encoder getUrlEncoder() {
101
         return Encoder.RFC4648_URLSAFE;
102
    }
103

  
104
    /**
105
     * Returns a {@link Encoder} that encodes using the
106
     * <a href="#mime">MIME</a> type base64 encoding scheme.
107
     *
108
     * @return  A Base64 encoder.
109
     */
110
    public static Encoder getMimeEncoder() {
111
        return Encoder.RFC2045;
112
    }
113

  
114
    /**
115
     * Returns a {@link Encoder} that encodes using the
116
     * <a href="#mime">MIME</a> type base64 encoding scheme
117
     * with specified line length and line separators.
118
     *
119
     * @param   lineLength
120
     *          the length of each output line (rounded down to nearest multiple
121
     *          of 4). If {@code lineLength <= 0} the output will not be separated
122
     *          in lines
123
     * @param   lineSeparator
124
     *          the line separator for each output line
125
     *
126
     * @return  A Base64 encoder.
127
     *
128
     * @throws  IllegalArgumentException if {@code lineSeparator} includes any
129
     *          character of "The Base64 Alphabet" as specified in Table 1 of
130
     *          RFC 2045.
131
     */
132
    public static Encoder getMimeEncoder(int lineLength, byte[] lineSeparator) {
133
         Objects.requireNonNull(lineSeparator);
134
         int[] base64 = Decoder.fromBase64;
135
         for (byte b : lineSeparator) {
136
             if (base64[b & 0xff] != -1)
137
                 throw new IllegalArgumentException(
138
                     "Illegal base64 line separator character 0x" + Integer.toString(b, 16));
139
         }
140
         if (lineLength <= 0) {
141
             return Encoder.RFC4648;
142
         }
143
         return new Encoder(false, lineSeparator, lineLength >> 2 << 2, true);
144
    }
145

  
146
    /**
147
     * Returns a {@link Decoder} that decodes using the
148
     * <a href="#basic">Basic</a> type base64 encoding scheme.
149
     *
150
     * @return  A Base64 decoder.
151
     */
152
    public static Decoder getDecoder() {
153
         return Decoder.RFC4648;
154
    }
155

  
156
    /**
157
     * Returns a {@link Decoder} that decodes using the
158
     * <a href="#url">URL and Filename safe</a> type base64
159
     * encoding scheme.
160
     *
161
     * @return  A Base64 decoder.
162
     */
163
    public static Decoder getUrlDecoder() {
164
         return Decoder.RFC4648_URLSAFE;
165
    }
166

  
167
    /**
168
     * Returns a {@link Decoder} that decodes using the
169
     * <a href="#mime">MIME</a> type base64 decoding scheme.
170
     *
171
     * @return  A Base64 decoder.
172
     */
173
    public static Decoder getMimeDecoder() {
174
         return Decoder.RFC2045;
175
    }
176

  
177
    /**
178
     * This class implements an encoder for encoding byte data using
179
     * the Base64 encoding scheme as specified in RFC 4648 and RFC 2045.
180
     *
181
     * <p> Instances of {@link Encoder} class are safe for use by
182
     * multiple concurrent threads.
183
     *
184
     * <p> Unless otherwise noted, passing a {@code null} argument to
185
     * a method of this class will cause a
186
     * {@link java.lang.NullPointerException NullPointerException} to
187
     * be thrown.
188
     *
189
     * @see     Decoder
190
     * @since   1.8
191
     */
192
    public static class Encoder {
193

  
194
        private final byte[] newline;
195
        private final int linemax;
196
        private final boolean isURL;
197
        private final boolean doPadding;
198

  
199
        private Encoder(boolean isURL, byte[] newline, int linemax, boolean doPadding) {
200
            this.isURL = isURL;
201
            this.newline = newline;
202
            this.linemax = linemax;
203
            this.doPadding = doPadding;
204
        }
205

  
206
        /**
207
         * This array is a lookup table that translates 6-bit positive integer
208
         * index values into their "Base64 Alphabet" equivalents as specified
209
         * in "Table 1: The Base64 Alphabet" of RFC 2045 (and RFC 4648).
210
         */
211
        private static final char[] toBase64 = {
212
            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
213
            'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
214
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
215
            'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
216
            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
217
        };
218

  
219
        /**
220
         * It's the lookup table for "URL and Filename safe Base64" as specified
221
         * in Table 2 of the RFC 4648, with the '+' and '/' changed to '-' and
222
         * '_'. This table is used when BASE64_URL is specified.
223
         */
224
        private static final char[] toBase64URL = {
225
            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
226
            'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
227
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
228
            'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
229
            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '_'
230
        };
231

  
232
        private static final int MIMELINEMAX = 76;
233
        private static final byte[] CRLF = new byte[] {'\r', '\n'};
234

  
235
        static final Encoder RFC4648 = new Encoder(false, null, -1, true);
236
        static final Encoder RFC4648_URLSAFE = new Encoder(true, null, -1, true);
237
        static final Encoder RFC2045 = new Encoder(false, CRLF, MIMELINEMAX, true);
238

  
239
        private final int outLength(int srclen) {
240
            int len = 0;
241
            if (doPadding) {
242
                len = 4 * ((srclen + 2) / 3);
243
            } else {
244
                int n = srclen % 3;
245
                len = 4 * (srclen / 3) + (n == 0 ? 0 : n + 1);
246
            }
247
            if (linemax > 0)                                  // line separators
248
                len += (len - 1) / linemax * newline.length;
249
            return len;
250
        }
251

  
252
        /**
253
         * Encodes all bytes from the specified byte array into a newly-allocated
254
         * byte array using the {@link Base64} encoding scheme. The returned byte
255
         * array is of the length of the resulting bytes.
256
         *
257
         * @param   src
258
         *          the byte array to encode
259
         * @return  A newly-allocated byte array containing the resulting
260
         *          encoded bytes.
261
         */
262
        public byte[] encode(byte[] src) {
263
            int len = outLength(src.length);          // dst array size
264
            byte[] dst = new byte[len];
265
            int ret = encode0(src, 0, src.length, dst);
266
            if (ret != dst.length)
267
                 return Arrays.copyOf(dst, ret);
268
            return dst;
269
        }
270

  
271
        /**
272
         * Encodes all bytes from the specified byte array using the
273
         * {@link Base64} encoding scheme, writing the resulting bytes to the
274
         * given output byte array, starting at offset 0.
275
         *
276
         * <p> It is the responsibility of the invoker of this method to make
277
         * sure the output byte array {@code dst} has enough space for encoding
278
         * all bytes from the input byte array. No bytes will be written to the
279
         * output byte array if the output byte array is not big enough.
280
         *
281
         * @param   src
282
         *          the byte array to encode
283
         * @param   dst
284
         *          the output byte array
285
         * @return  The number of bytes written to the output byte array
286
         *
287
         * @throws  IllegalArgumentException if {@code dst} does not have enough
288
         *          space for encoding all input bytes.
289
         */
290
        public int encode(byte[] src, byte[] dst) {
291
            int len = outLength(src.length);         // dst array size
292
            if (dst.length < len)
293
                throw new IllegalArgumentException(
294
                    "Output byte array is too small for encoding all input bytes");
295
            return encode0(src, 0, src.length, dst);
296
        }
297

  
298
        /**
299
         * Encodes the specified byte array into a String using the {@link Base64}
300
         * encoding scheme.
301
         *
302
         * <p> This method first encodes all input bytes into a base64 encoded
303
         * byte array and then constructs a new String by using the encoded byte
304
         * array and the {@link java.nio.charset.StandardCharsets#ISO_8859_1
305
         * ISO-8859-1} charset.
306
         *
307
         * <p> In other words, an invocation of this method has exactly the same
308
         * effect as invoking
309
         * {@code new String(encode(src), StandardCharsets.ISO_8859_1)}.
310
         *
311
         * @param   src
312
         *          the byte array to encode
313
         * @return  A String containing the resulting Base64 encoded characters
314
         */
315
        @SuppressWarnings("deprecation")
316
        public String encodeToString(byte[] src) {
317
            byte[] encoded = encode(src);
318
            return new String(encoded, 0, 0, encoded.length);
319
        }
320

  
321
        /**
322
         * Encodes all remaining bytes from the specified byte buffer into
323
         * a newly-allocated ByteBuffer using the {@link Base64} encoding
324
         * scheme.
325
         *
326
         * Upon return, the source buffer's position will be updated to
327
         * its limit; its limit will not have been changed. The returned
328
         * output buffer's position will be zero and its limit will be the
329
         * number of resulting encoded bytes.
330
         *
331
         * @param   buffer
332
         *          the source ByteBuffer to encode
333
         * @return  A newly-allocated byte buffer containing the encoded bytes.
334
         */
335
        public ByteBuffer encode(ByteBuffer buffer) {
336
            int len = outLength(buffer.remaining());
337
            byte[] dst = new byte[len];
338
            int ret = 0;
339
            if (buffer.hasArray()) {
340
                ret = encode0(buffer.array(),
341
                              buffer.arrayOffset() + buffer.position(),
342
                              buffer.arrayOffset() + buffer.limit(),
343
                              dst);
344
                buffer.position(buffer.limit());
345
            } else {
346
                byte[] src = new byte[buffer.remaining()];
347
                buffer.get(src);
348
                ret = encode0(src, 0, src.length, dst);
349
            }
350
            if (ret != dst.length)
351
                 dst = Arrays.copyOf(dst, ret);
352
            return ByteBuffer.wrap(dst);
353
        }
354

  
355
        /**
356
         * Wraps an output stream for encoding byte data using the {@link Base64}
357
         * encoding scheme.
358
         *
359
         * <p> It is recommended to promptly close the returned output stream after
360
         * use, during which it will flush all possible leftover bytes to the underlying
361
         * output stream. Closing the returned output stream will close the underlying
362
         * output stream.
363
         *
364
         * @param   os
365
         *          the output stream.
366
         * @return  the output stream for encoding the byte data into the
367
         *          specified Base64 encoded format
368
         */
369
        public OutputStream wrap(OutputStream os) {
370
            Objects.requireNonNull(os);
371
            return new EncOutputStream(os, isURL ? toBase64URL : toBase64,
372
                                       newline, linemax, doPadding);
373
        }
374

  
375
        /**
376
         * Returns an encoder instance that encodes equivalently to this one,
377
         * but without adding any padding character at the end of the encoded
378
         * byte data.
379
         *
380
         * <p> The encoding scheme of this encoder instance is unaffected by
381
         * this invocation. The returned encoder instance should be used for
382
         * non-padding encoding operation.
383
         *
384
         * @return an equivalent encoder that encodes without adding any
385
         *         padding character at the end
386
         */
387
        public Encoder withoutPadding() {
388
            if (!doPadding)
389
                return this;
390
            return new Encoder(isURL, newline, linemax, false);
391
        }
392

  
393
        private int encode0(byte[] src, int off, int end, byte[] dst) {
394
            char[] base64 = isURL ? toBase64URL : toBase64;
395
            int sp = off;
396
            int slen = (end - off) / 3 * 3;
397
            int sl = off + slen;
398
            if (linemax > 0 && slen  > linemax / 4 * 3)
399
                slen = linemax / 4 * 3;
400
            int dp = 0;
401
            while (sp < sl) {
402
                int sl0 = Math.min(sp + slen, sl);
403
                for (int sp0 = sp, dp0 = dp ; sp0 < sl0; ) {
404
                    int bits = (src[sp0++] & 0xff) << 16 |
405
                               (src[sp0++] & 0xff) <<  8 |
406
                               (src[sp0++] & 0xff);
407
                    dst[dp0++] = (byte)base64[(bits >>> 18) & 0x3f];
408
                    dst[dp0++] = (byte)base64[(bits >>> 12) & 0x3f];
409
                    dst[dp0++] = (byte)base64[(bits >>> 6)  & 0x3f];
410
                    dst[dp0++] = (byte)base64[bits & 0x3f];
411
                }
412
                int dlen = (sl0 - sp) / 3 * 4;
... Ce différentiel a été tronqué car il excède la taille maximale pouvant être affichée.

Formats disponibles : Unified diff